【全隊項目】智能學術海報生成系統PosterGenius--圖片布局生成模型LayoutPrompt(1)

🌈?個人主頁:十二月的貓-CSDN博客
🔥?系列專欄:?🏀大模型實戰訓練營_十二月的貓的博客-CSDN博客

💪🏻?十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光

目錄

1. 前言

2. LayoutPrompt介紹

3. LayoutPrompt · 布局序列化模塊

3.1 固定化Prompt

3.2?父類序列化模塊

3.3?子類序列化模塊

4. 總結


1. 前言

? ? ? ? 貓貓不知道大家有沒有思考過圖片布局生成模型,這算是生成模型的一個非常小的子任務了。前面帶大家學習過生成模型,包括GAN、Diffusion等。這些都算是生成模型的研究子領域,利用這些子領域的知識,我們可以來研究具體的任務,例如生成圖片、按照語言提示生成圖片、按照布局提示生成圖片等。

????????同樣生成布局也是生成模型中的一個具體任務,其實思路也是非常簡單。生成圖片這個任務中更具體的任務是生成海報、生成照片、生成動漫圖片等。因為直接生成一個海報難度太大,我們就先去生成布局,然后在具體布局的約束下去具體生成完整圖片。可以簡單給大家看一下布局是什么:

? ? ? ? 貓貓研究這個呢,主要還是因為創新實訓和軟件創新大賽兩個需要。同時由于貓貓也研究過一點生成模型,因此這個學期就研究一下這個領域啦~~如果大家也對這個領域感興趣,可以關注我們團隊的專欄(布局生成模型是我們海報生成系統中的一個子模塊,希望更多貓友參與到我們的開發當中哦):大模型實戰訓練營_十二月的貓的博客-CSDN博客

2. LayoutPrompt介紹

總的來說,為了完成LayoutPrompt模型,我們需要完成的子模塊有:

  • 數據預處理模塊:該模塊主要就是利用基礎數據預處理方法對數據集中的所有數據樣本進行預處理。
  • 動態樣本選擇模塊:從訓練集中檢索最相關的樣本,然后作為最直接的上下文(約束信息)送給大語言模型。
  • 布局序列化模塊:用于將上面所選的樣本布局轉化為序列表述(因為大語言模型對序列化輸入有更好的效果)。序列化數據就是類似 自然語言、代碼等
  • 大語言模型模塊:將序列化處理后的所有樣本一起送給大語言模型,讓大語言模型參考的情況下給出自己的答案。
  • 大語言模型解析模塊:用于將大語言模型給出的布局結果解析為標準化的輸出。
  • 布局排序模塊(布局評價模塊):評價大語言模型生成的布局的質量分數,并做一個排序。?

具體的模型圖如下:

模型運行具體流程如下:

  1. 用戶輸入前導信息,例如畫布大小,任務類型等,數據預處理模塊預處理數據庫(用戶根據自己的任務可以選擇數據庫,如海報布局數據庫、手機UI設計數據庫)中的所有數據。
  2. 動態樣本選擇模塊得到處理后的數據庫數據,然后根據用戶輸入的前導信息選擇合適的example樣本。
  3. 將樣本+前導信息+測試樣本送給大語言模型。
  4. 由大語言模型生成最終的layout,送給Rank模塊。
  5. Rank模塊排序后分數最高的就是最終輸出。

3. LayoutPrompt · 布局序列化模塊

布局序列化模塊:本質就是序列化+Prompt。兩者核心都是固定

序列化:將輸入輸出按照固定序列格式調整。

? ? ? ? 例如輸出固定如下:

  • "標題 0 0.1 0.2 0.3 0.4 | 正文 1 0.5 0.6 0.7 0.8"
  • # < html >
    # < body >
    # < div
    # style = "..." > 標題_0 < / div >
    # < div
    # style = "..." > 正文_1 < / div >
    # < / body >
    # < / html 

Prompt:根據不同任務,輸入需要不同Prompt,同時序列化格式。

? ? ? ? 例如輸入固定如下:

一句話來說,布局序列化模塊準備的就是模型中的這一部分:

  • 前導部分(PREAMBLE):固定Prompt,用戶輸入畫布大小高度等。
  • 輸入限制(INPUT CONSTRAINT) :會有兩種表示形式1.如上圖的seq形式;2.html形式。
  • 輸出布局(OUTPUT LAYOUT):得到布局的坐標data后(由其他模塊負責),序列化輸出上圖結果。

從代碼角度來說分為三個部分:

  • 固定化Prompt。
  • 父類序列化模塊(固定輸出序列結構,輸入序列留接口給子類實現)
  • 子類序列化模塊(一個子類對應一個具體的任務,不同任務輸入結構不一樣)

從任務角度存在以下七種:

  • 元素類型任務(限制layout中的元素)
  • 元素類型,元素尺寸限制任務
  • 元素類型,元素之間位置關系
  • 元素補全(根據部分已知布局元素,生成完整布局結構)
  • 元素尺寸修正(給出類型和尺寸,模型自己修正尺寸)
  • 防止遮擋的布局生成
  • 文本描述下的布局生成

3.1 固定化Prompt

PREAMBLE = ("Please generate a layout based on the given information. ""You need to ensure that the generated layout looks realistic, with elements well aligned and avoiding unnecessary overlap.\n""Task Description: {}\n""Layout Domain: {} layout\n""Canvas Size: canvas width is {}px, canvas height is {}px"
)
# html的頭部
HTML_PREFIX = """<html>
<body>
<div class="canvas" style="left: 0px; top: 0px; width: {}px; height: {}px"></div>
"""
# html的結尾
HTML_SUFFIX = """</body>
</html>"""# html的body
HTML_TEMPLATE = """<div class="{}" style="left: {}px; top: {}px; width: {}px; height: {}px"></div>
"""HTML_TEMPLATE_WITH_INDEX = """<div class="{}" style="index: {}; left: {}px; top: {}px; width: {}px; height: {}px"></div>
"""
  • 本部分主要是為了固定輸入輸出的一些序列化格式,同時固定前導部分
  • 用戶在這里通過前端輸入自己想要的畫布大小高度等信息。

3.2?父類序列化模塊

# 序列化的父類,后面有具體任務不同的序列化
# 所謂序列化本質就是固定輸入的prompt形式,同時固定輸出的一個形式。
class Serializer:def __init__(self,input_format: str,output_format: str,index2label: dict,canvas_width: int,canvas_height: int,add_index_token: bool = True,add_sep_token: bool = True,sep_token: str = "|",add_unk_token: bool = False,unk_token: str = "<unk>",):self.input_format = input_formatself.output_format = output_formatself.index2label = index2labelself.canvas_width = canvas_widthself.canvas_height = canvas_heightself.add_index_token = add_index_tokenself.add_sep_token = add_sep_tokenself.sep_token = sep_tokenself.add_unk_token = add_unk_tokenself.unk_token = unk_tokendef build_input(self, data):if self.input_format == "seq":return self._build_seq_input(data)elif self.input_format == "html":return self._build_html_input(data)else:raise ValueError(f"Unsupported input format: {self.input_format}")# check value is not nulldef _build_seq_input(self, data):raise NotImplementedErrordef _build_html_input(self, data):raise NotImplementedErrordef build_output(self, data, label_key="labels", bbox_key="discrete_gold_bboxes"):if self.output_format == "seq":return self._build_seq_output(data, label_key, bbox_key)elif self.output_format == "html":return self._build_html_output(data, label_key, bbox_key)# # 輸入數據結構示例# data = {#     "labels": [0, 1],  # 標簽索引#     "discrete_gold_bboxes": [  # 坐標列表(假設已離散化)#         [0.1, 0.2, 0.3, 0.4],#         [0.5, 0.6, 0.7, 0.8]#     ]# }# "標題 0 0.1 0.2 0.3 0.4 | 正文 1 0.5 0.6 0.7 0.8"def _build_seq_output(self, data, label_key, bbox_key):# 在字典中存儲的標簽信息,和邊框信息(不是存儲具體字,而是存儲信息)labels = data[label_key]bboxes = data[bbox_key]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]bbox = bboxes[idx].tolist()tokens.append(label)if self.add_index_token:tokens.append(str(idx))tokens.extend(map(str, bbox)) # extend一次性添加很多值,append一次添加一個值。map(function,list):把function作用在list上。str():將其他類型轉為str類型。if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token) # 添加隔離符號return " ".join(tokens)# # 輸出結構# < html ># < body ># < div# style = "..." > 標題_0 < / div ># < div# style = "..." > 正文_1 < / div ># < / body ># < / html >def _build_html_output(self, data, label_key, bbox_key):labels = data[label_key]bboxes = data[bbox_key]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]  # 使用 HTML_PREFIX 作為 HTML 頁面的開頭,并將畫布寬度和高度傳遞進去。_TEMPLATE = HTML_TEMPLATE_WITH_INDEX if self.add_index_token else HTML_TEMPLATE # 根據 add_index_token 決定使用哪種模板:帶索引的模板或普通模板。for idx in range(len(labels)):label = self.index2label[int(labels[idx])]bbox = bboxes[idx].tolist()element = [label]if self.add_index_token:element.append(str(idx))element.extend(map(str, bbox))htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)return "".join(htmls)
  • 主要定義兩種輸出方式的序列化。第一種是以seq的形式輸出;第二種是以html的形式輸出。
  • 輸入形式的序列化(prompt+序列化)僅僅定義了模板交給子類(具體任務)來實現。
  • expand和append都是列表后追加,但expand一次追加很多個元素,append一次加一個。
  • map(function,list):將function作用在所有的list元素上。
  • 作用:1.?得到其他模塊給的Layout坐標data后,將其轉化為html或seq的固定序列化格式輸出。2.作為父類將輸入序列化交給子類實現。

3.3?子類序列化模塊

????????前面也說了,子類序列化模塊需要根據不同的任務要求給出不同的prompt以及序列化輸入。因此有多少個任務就會有多少個子類序列化模塊。在這里,貓貓僅僅展示兩個模塊的代碼,完整的代碼等專欄更新結束后,會同步放在Gitee以及CSDN賬號下。

任務一:限制元素類型的布局生成

class GenTypeSerializer(Serializer):task_type = "generation conditioned on given element types"constraint_type = ["Element Type Constraint: "]HTML_TEMPLATE_WITHOUT_ANK = '<div class="{}"></div>\n'HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEX = '<div class="{}" style="index: {}"></div>\n'def _build_seq_input(self, data):labels = data["labels"]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]tokens.append(label)if self.add_index_token:tokens.append(str(idx))if self.add_unk_token:tokens += [self.unk_token] * 4if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token)return " ".join(tokens)def _build_html_input(self, data):labels = data["labels"]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]if self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATE_WITH_INDEXelif self.add_index_token and not self.add_unk_token:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEXelif not self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATEelse:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANKfor idx in range(len(labels)):label = self.index2label[int(labels[idx])]element = [label]if self.add_index_token:element.append(str(idx))if self.add_unk_token:element += [self.unk_token] * 4htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)return "".join(htmls)def build_input(self, data):return self.constraint_type[0] + super().build_input(data)

任務二:限制元素類型,以及元素關系的布局生成

class GenRelationSerializer(Serializer):task_type = ("generation conditioned on given element relationships\n""'A left B' means that the center coordinate of A is to the left of the center coordinate of B. ""'A right B' means that the center coordinate of A is to the right of the center coordinate of B. ""'A top B' means that the center coordinate of A is above the center coordinate of B. ""'A bottom B' means that the center coordinate of A is below the center coordinate of B. ""'A center B' means that the center coordinate of A and the center coordinate of B are very close. ""'A smaller B' means that the area of A is smaller than the ares of B. ""'A larger B' means that the area of A is larger than the ares of B. ""'A equal B' means that the area of A and the ares of B are very close. ""Here, center coordinate = (left + width / 2, top + height / 2), ""area = width * height")constraint_type = ["Element Type Constraint: ", "Element Relationship Constraint: "]HTML_TEMPLATE_WITHOUT_ANK = '<div class="{}"></div>\n'HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEX = '<div class="{}" style="index: {}"></div>\n'def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.index2type = RelationTypes.index2type()def _build_seq_input(self, data):labels = data["labels"]relations = data["relations"]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]tokens.append(label)if self.add_index_token:tokens.append(str(idx))if self.add_unk_token:tokens += [self.unk_token] * 4if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token)type_cons = " ".join(tokens)if len(relations) == 0:return self.constraint_type[0] + type_constokens = []for idx in range(len(relations)):label_i = relations[idx][2]index_i = relations[idx][3]if label_i != 0:tokens.append("{} {}".format(self.index2label[int(label_i)], index_i))else:tokens.append("canvas")tokens.append(self.index2type[int(relations[idx][4])])label_j = relations[idx][0]index_j = relations[idx][1]if label_j != 0:tokens.append("{} {}".format(self.index2label[int(label_j)], index_j))else:tokens.append("canvas")if self.add_sep_token and idx < len(relations) - 1:tokens.append(self.sep_token)relation_cons = " ".join(tokens)return (self.constraint_type[0]+ type_cons+ "\n"+ self.constraint_type[1]+ relation_cons)def _build_html_input(self, data):labels = data["labels"]relations = data["relations"]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]if self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATE_WITH_INDEXelif self.add_index_token and not self.add_unk_token:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEXelif not self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATEelse:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANKfor idx in range(len(labels)):label = self.index2label[int(labels[idx])]element = [label]if self.add_index_token:element.append(str(idx))if self.add_unk_token:element += [self.unk_token] * 4htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)type_cons = "".join(htmls)if len(relations) == 0:return self.constraint_type[0] + type_constokens = []for idx in range(len(relations)):label_i = relations[idx][2]index_i = relations[idx][3]if label_i != 0:tokens.append("{} {}".format(self.index2label[int(label_i)], index_i))else:tokens.append("canvas")tokens.append(self.index2type[int(relations[idx][4])])label_j = relations[idx][0]index_j = relations[idx][1]if label_j != 0:tokens.append("{} {}".format(self.index2label[int(label_j)], index_j))else:tokens.append("canvas")if self.add_sep_token and idx < len(relations) - 1:tokens.append(self.sep_token)relation_cons = " ".join(tokens)return (self.constraint_type[0]+ type_cons+ "\n"+ self.constraint_type[1]+ relation_cons)
  • 針對此任務設計了具體的Prompt形式。
  • 輸入數據序列化有兩個部分:1、seq序列化;2、html序列化
  • seq序列化:用戶輸入限制后,需要結合Prompt序列化到INPUT_CONSTRAINT(
  • (注意:這個seq并不是完整的,僅僅是將用戶的限制要求填入):
  • html序列化:根據用戶輸入限制生成對應的html格式(注意:這個html并不是完整的,僅僅是將用戶的限制要求填入)
  • 作用:1.將用戶輸入的限制轉化為某種序列化(seq序列化 或 html序列化)。2.結合固定Prompt包裝成完整的INPUT CONSTRAINT

4. 總結

本篇文章帶大家深入了解了PosterGenius項目的Layout生成部分的第一篇,后續將更新Layout系列的第二篇。歡迎大家繼續支持貓貓呀!!

?【如果想學習更多深度學習文章,可以訂閱一下熱門專欄】

  • 《PyTorch科研加速指南:即插即用式模塊開發》_十二月的貓的博客-CSDN博客
  • 《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客
  • 《AI認知筑基三十講》_十二月的貓的博客-CSDN博客

如果想要學習更多pyTorch/python編程的知識,大家可以點個關注并訂閱,持續學習、天天進步你的點贊就是我更新的動力,如果覺得對你有幫助,辛苦友友點個贊,收個藏呀~~~

本文撰寫人:十二月的貓? ?十二月的貓-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

位圖的實現和拓展

一&#xff1a;位圖的介紹 ①&#xff1a;需要位圖的場景 給40億個不重復的無符號整數&#xff0c;沒排過序。給一個無符號整數&#xff0c;如何快速判斷一個數是否在這40億個數中&#xff1f; 要判斷一個數是否在某一堆數中&#xff0c;我們可能會想到如下方法&#xff1a; A…

排序功法入門指南【江湖算法筆記】

話說江湖風云變幻&#xff0c;各路英雄好漢行走江湖&#xff0c;總得有個名號排行。若問“東邪西毒南帝北丐”誰強誰弱&#xff0c;總得排個座次不是&#xff1f;這排序之道&#xff0c;恰似武功秘籍&#xff0c;練好了能號令群雄&#xff0c;練岔了怕是要被笑掉大牙&#xff0…

【中間件】brpc_基礎_用戶態線程中斷

bthread之用戶態線程中斷 源碼 1 簡介 interrupt_pthread 核心功能是 通過信號機制中斷阻塞的 pthread 線程&#xff0c;以實現線程的協作式中斷。 2 核心功能與設計 2.1 信號選擇與注冊 信號選擇&#xff1a;使用 SIGURG 作為中斷信號。 原因&#xff1a;SIGURG 通常用于…

Linux 的網絡卡

#本機操作系統CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 網卡能不能被捉到可以使用【dmesg|grep xx】來判斷&#xff0c;有沒有驅動則可以使用lsmod看看模塊有沒有加載核心&#xff01;最后&#xff0c;以ifconfig xxx測試看看 觀察核心所捉到的網卡…

前端雙工通信的幾種方案詳細描述

前端實現雙工通信&#xff08;全雙工或半雙工&#xff09;的常見方案及詳細實現如下&#xff1a; 一、WebSocket&#xff08;全雙工&#xff09; 原理&#xff1a;基于 TCP 的持久化協議&#xff0c;客戶端與服務端建立雙向通信通道&#xff0c;支持實時雙向數據傳輸。 // 客…

KUKA機器人快速啟動設置

KUKA機器人在首次開機啟動時&#xff0c;有時在示教器上需要進行投入運行等相關的設置。如以下相關的信息需要處理&#xff1a; 1、機器人系統開機后&#xff0c;選擇T1運行模式&#xff1b;2、顯示提示信息&#xff1a;“RDC 存儲器和控制系統不一致什么被更換了”時&#xf…

游戲代碼C

以下將結合不同編程語言的特點及游戲開發中的實際應用&#xff0c;展示多種語言的游戲代碼示例&#xff08;以簡單游戲為例&#xff0c;展示代碼結構和邏輯差異&#xff09;。由于代碼篇幅較長&#xff0c;我將分語言進行說明并引用相關來源&#xff1a; 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略實現與實戰指南

引言 在LangChain的Agent框架中&#xff0c;zero-shot-react-description 是一種預定義的Agent類型&#xff0c;它結合了Zero-Shot&#xff08;零樣本學習&#xff09; 和 ReAct&#xff08;推理行動&#xff09; 策略&#xff0c;主要用于根據工具的描述動態選擇和執行工具&a…

PyQt 或 PySide6 進行 GUI 開發文檔與教程

一、官網文檔 Qt 官方文檔&#xff1a;Porting to Qt 6 | Qt 6.9Qt 維基&#xff1a;???????Qt WikiQt for Python (PySide6) &#xff1a;???????Qt for Python - Qt WikiPySide6 快速上手指南&#xff1a;???????Getting Started - Qt for Python PyS…

2024年第十五屆藍橋杯省賽B組Python【 簡潔易懂題解】

2024年第十五屆藍橋杯省賽B組Python題解 一、整體情況說明 2024年第十五屆藍橋杯省賽B組Python組考試共包含8道題目&#xff0c;分為結果填空題和程序設計題兩類。 考試時間&#xff1a;4小時編程環境&#xff1a;Python 3.x&#xff0c;禁止使用第三方庫&#xff0c;僅可使…

Go語言--語法基礎4--基本數據類型--類型轉換

Go 是一種強類型的語言&#xff0c;所以如果在賦值的時候兩邊類型不一致會報錯。一個類型的值可以被轉換成另一種類型的值。由于 Go 語言不存在隱式類型轉換&#xff0c;因此所有的類型轉換都必須顯式的聲明。 強制類型轉換語法 使用 type (a) 這種形式來進行強制類型轉換&am…

nginx 代理時怎么更改 Remote Address 請求頭

今天工作中遇到用 localhost 訪問網站能訪問后臺 api&#xff0c;但是用本機IP地址后就拒絕訪問&#xff0c;我懷疑是后臺獲取 Remote Address 然后設置白名單了只能 localhost 訪問。 想用 nginx 更改 Remote Address server {listen 8058;server_name localhost;loca…

LeetCode刷題鏈表

文章目錄 鏈表總結 常用技巧兩數相加題解代碼 兩兩交換鏈表中的節點題解代碼 重排鏈表題解代碼 合并k個升序鏈表題解代碼 K個一組翻轉鏈表題解代碼 鏈表總結 常用技巧 畫圖 直觀 形象 便于理解引入虛擬頭節點&#xff0c;便于處理邊界情況&#xff0c;方便我們對鏈表進行…

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法 文章目錄 ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法前言1、前期準備工作2、多固件燒錄方法3、單固件燒錄方法總結 前言 使用正點原子的ESP32S3 BOX開發板獨立燒錄編譯生成的xxx.bin固件無法正常運行起來&#…

Webug4.0靶場通關筆記10- 第14關鏈接注入

目錄 第14關 鏈接注入 1.打開靶場 2.源碼分析 3.滲透實戰 &#xff08;1&#xff09;方法1&#xff1a;跳轉外部網頁 &#xff08;2&#xff09;方法2&#xff1a;獲取cookie 4.漏洞防御 本文通過《webug靶場第14關 鏈接注入》來進行滲透實戰。 第14關 鏈接注入 鏈接注…

SpringBoot的汽車商城后臺管理系統源碼開發實現

概述 汽車商城后臺管理系統專為汽車4S店和經銷商設計&#xff0c;提供全面的汽車管理系統解決方案。 主要內容 1. 核心功能模塊 系統提供以下主要功能&#xff1a; ??銷售管理??&#xff1a;記錄銷售信息&#xff0c;跟蹤交易進度??客戶管理??&#xff1a;維護客戶…

VBA代碼解決方案第二十四講:EXCEL中,如何刪除重復數據行

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

日本IT行業|salesforce開發語言占據的地位

在日本的IT行業中&#xff0c;Salesforce 開發語言處于一個較為專業但穩步增長的細分領域&#xff0c;并不是主流開發語言&#xff08;如 Java、Python、PHP&#xff09;&#xff0c;但其在某些行業和場景中地位越來越重要。 本篇以下是詳細分析&#xff1a; Salesforce開發語言…

前端開發,文件在鏡像服務器上不存在問題:Downloading binary from...Cannot download...

問題與處理策略 問題描述 在 Vue 項目中&#xff0c;執行 npm i 下載依賴時&#xff0c;報如下錯誤 Downloading binary from https://npm.taobao.org/mirrors/node-sass//v4.14.1/win32-x64-72_binding.node Cannot download "https://npm.taobao.org/mirrors/node-sa…

基于Vue2 + Element 實現任務列表管理功能的詳細教程

前言&#xff1a;本文介紹的是如何從0開始搭建Vue2項目到1實現對任務添加、刪除和篩選的功能&#xff0c;&#x1f517; 相關鏈接Vue 入門(安裝與應用超詳細教程) ? 【作者主頁—&#x1f4da;閱讀更多優質文章、獲取更多優質源碼】 目錄 一 . 項目搭建 1.1 安裝node.js 1.…