国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件

這篇具有很好參考價(jià)值的文章主要介紹了一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

說在前面

平時(shí)大家都是怎么管理自己的瀏覽器書簽數(shù)據(jù)的呢?有沒有過公司和家里的電腦瀏覽器書簽不同步的情況?有沒有過電腦突然壞了但書簽數(shù)據(jù)沒有導(dǎo)出,導(dǎo)致書簽數(shù)據(jù)丟失了?解決這些問題的方法有很多,我選擇自己寫個(gè)chrome插件來做書簽同步。

實(shí)現(xiàn)方案

通過 gitee 來做存取

建一個(gè)私有倉庫來保存自己的書簽?zāi)夸浶畔?,需要同步的時(shí)候再獲取 gitee 倉庫的書簽?zāi)夸浀奖镜亍_@樣不用自己寫服務(wù)端對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),減少了很多不必要的開發(fā)工作。

實(shí)現(xiàn)步驟

一、準(zhǔn)備工作

1、新建 gitee 倉庫

直接在gitee上新建倉庫即可。

我們不想要書簽信息公開,所以選擇勾選上私有:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

創(chuàng)建完的初始倉庫是這樣的:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

我們?cè)傩略鲆粋€(gè)目錄,用于存放和書簽相關(guān)的文件:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

在該目錄下新增一個(gè)文件,用于保存書簽導(dǎo)出的數(shù)據(jù):
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

二、插件編寫

完成前面的準(zhǔn)備工作,新建完 gitee 倉庫之后,我們便可以正式開始進(jìn)行插件的編寫了。

1、插件模板
  • 安裝依賴jyeontu
npm i -g jyeontu
  • 獲取模板
jyeontu create

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

  • 生成模板

根據(jù)提示輸入相關(guān)信息即可

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

2、giteeAPI

我們可以通過 giteeAPI 來對(duì) gitee 倉庫進(jìn)行操作,下面是 giteeAPI 的操作文檔:
https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoStargazers?ex=no

獲取gitee指定文件的內(nèi)容

我們可以通過下面代碼來獲取到gitee指定倉庫指定文件的內(nèi)容:

async function fetchFileContent(apiUrl, accessToken) {
  const response = await fetch(apiUrl, {
    headers: {
      Authorization: "token " + accessToken,
    },
  });
  const fileData = await response.json();
  return fileData.content;
}

export async function getFile(gitInfo) {
  const accessToken = gitInfo.token;
  const apiUrl =
    "https://gitee.com/api/v5/repos/" +
    gitInfo.owner +
    "/" +
    gitInfo.repo +
    "/contents/" +
    gitInfo.filePath;

  const fileContent = await fetchFileContent(apiUrl, accessToken);
  const decodedContent = atob(fileContent); // 解碼Base64編碼的文件內(nèi)容
  const decoder = new TextDecoder();
  const decodedData = decoder.decode(
    new Uint8Array([...decodedContent].map((char) => char.charCodeAt(0)))
  );
  return JSON.parse(decodedData);
}
修改指定文件的內(nèi)容數(shù)據(jù)

我們需要先獲取到文件,拿到文件的sha值,后面通過sha來對(duì)文件進(jìn)行編輯操作。
btoa函數(shù)只能處理Latin1字符范圍內(nèi)的字符串,對(duì)超出Latin1字符范圍的字符串進(jìn)行Base64編碼,我們需要進(jìn)行以下操作,使用TextEncoder對(duì)象來將字符串轉(zhuǎn)換為字節(jié)數(shù)組,然后再進(jìn)行Base64編碼。

async function fetchFileContent(apiUrl, accessToken) {
  const response = await fetch(apiUrl, {
    headers: {
      Authorization: "token " + accessToken,
    },
  });
  const fileData = await response.json();
  return fileData.content;
}
async function getDecodedContent(content) {
  const decodedContent = atob(content); // 解碼Base64編碼的文件內(nèi)容
  const decoder = new TextDecoder();
  const decodedData = decoder.decode(
    new Uint8Array([...decodedContent].map((char) => char.charCodeAt(0)))
  );
  return JSON.parse(decodedData);
}
async function putFileContent(apiUrl, accessToken, encodedContent, sha) {
  const commitData = {
    access_token: accessToken,
    content: encodedContent,
    message: "Modified file",
    sha: sha,
  };

  const putResponse = await fetch(apiUrl, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
      Authorization: "token " + accessToken,
    },
    body: JSON.stringify(commitData),
  });

  if (putResponse.ok) {
    console.log("File modified successfully.");
  } else {
    console.error("Failed to modify file.");
  }
}
export async function modifyFile(gitInfo, modifiedContent) {
  const accessToken = gitInfo.token;
  const apiUrl =
    "https://gitee.com/api/v5/repos/" +
    gitInfo.owner +
    "/" +
    gitInfo.repo +
    "/contents/" +
    gitInfo.filePath;

  try {
    const fileContent = await fetchFileContent(apiUrl, accessToken);
    const content = await getDecodedContent(fileContent);
    modifiedContent = mergeBookmarks(content, modifiedContent);
    modifiedContent = JSON.stringify(modifiedContent);
    const encoder = new TextEncoder();
    const data = encoder.encode(modifiedContent);
    const encodedContent = btoa(
      String.fromCharCode.apply(null, new Uint8Array(data))
    );

    await putFileContent(apiUrl, accessToken, encodedContent, fileContent.sha);
  } catch (error) {
    console.error("An error occurred:", error);
  }
}
3、indexDb存取

我們不希望每次打開都需要去重新填寫gitee倉庫的相關(guān)信息,所以這里我們使用indexDb來對(duì)gitee倉庫的相關(guān)信息做一個(gè)保存。

export class IndexedDB {
  constructor(databaseName, storeName) {
    this.databaseName = databaseName;
    this.storeName = storeName;
    this.db = null;
  }

  open() {
    return new Promise((resolve, reject) => {
      const request = window.indexedDB.open(this.databaseName);

      request.onerror = () => {
        reject(new Error("Failed to open database"));
      };

      request.onsuccess = () => {
        this.db = request.result;
        resolve();
      };

      request.onupgradeneeded = (event) => {
        this.db = event.target.result;
        if (!this.db.objectStoreNames.contains(this.storeName)) {
          this.db.createObjectStore(this.storeName, {
            keyPath: "id",
            autoIncrement: true,
          });
        }
      };
    });
  }

  createDatabase() {
    return new Promise((resolve, reject) => {
      const request = window.indexedDB.open(this.databaseName);

      request.onerror = () => {
        reject(new Error("Failed to create database"));
      };

      request.onsuccess = () => {
        this.db = request.result;
        this.db.close();
        resolve();
      };

      request.onupgradeneeded = (event) => {
        this.db = event.target.result;
        if (!this.db.objectStoreNames.contains(this.storeName)) {
          this.db.createObjectStore(this.storeName, {
            keyPath: "id",
            autoIncrement: true,
          });
        }
        this.db.close();
        resolve();
      };
    });
  }

  close() {
    if (this.db) {
      this.db.close();
      this.db = null;
    }
  }

  add(data) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, "readwrite");
      const objectStore = transaction.objectStore(this.storeName);
      const request = objectStore.add(data);

      request.onsuccess = () => {
        resolve(request.result);
      };

      request.onerror = () => {
        reject(new Error("Failed to add data"));
      };
    });
  }

  getAll() {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, "readonly");
      const objectStore = transaction.objectStore(this.storeName);
      const request = objectStore.getAll();

      request.onsuccess = () => {
        resolve(request.result);
      };

      request.onerror = () => {
        reject(new Error("Failed to get data"));
      };
    });
  }

  getById(id) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, "readonly");
      const objectStore = transaction.objectStore(this.storeName);
      const request = objectStore.get(id);

      request.onsuccess = () => {
        resolve(request.result);
      };

      request.onerror = () => {
        reject(new Error("Failed to get data"));
      };
    });
  }

  delete(id) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, "readwrite");
      const objectStore = transaction.objectStore(this.storeName);
      const request = objectStore.delete(id);

      request.onsuccess = () => {
        resolve();
      };

      request.onerror = () => {
        reject(new Error("Failed to delete data"));
      };
    });
  }

  update(id, newData) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, "readwrite");
      const objectStore = transaction.objectStore(this.storeName);
      const getRequest = objectStore.get(id);

      getRequest.onsuccess = () => {
        const oldData = getRequest.result;

        if (!oldData) {
          const addRequest = objectStore.add({ ...newData, id });

          addRequest.onsuccess = () => {
            resolve({ ...newData, id });
          };

          addRequest.onerror = () => {
            reject(new Error("Failed to add data"));
          };
        } else {
          const mergedData = { ...oldData, ...newData };
          const putRequest = objectStore.put(mergedData);

          putRequest.onsuccess = () => {
            resolve(mergedData);
          };

          putRequest.onerror = () => {
            reject(new Error("Failed to update data"));
          };
        }
      };
      getRequest.onerror = () => {
        reject(new Error("Failed to get data"));
      };
    });
  }
}
4、書簽存取
獲取chrome書簽

要獲取 Chrome 瀏覽器的書簽?zāi)夸洠覀兛梢允褂?Chrome 瀏覽器提供的 API——chrome.bookmarks。下面是一個(gè)示例代碼,演示如何使用chrome.bookmarks API 獲取 Chrome 瀏覽器的書簽?zāi)夸洠?/p>

export const getBookmarks = () => {
  return new Promise((resolve) => {
    chrome.bookmarks.getTree(function (bookmarkTreeNodes) {
      resolve(bookmarkTreeNodes);
    });
  });
};

在上述代碼中,我們首先使用chrome.bookmarks.getTree()方法獲取 Chrome 瀏覽器的書簽?zāi)夸洏洹?/p>

請(qǐng)注意,要使用chrome.bookmarks API,你需要在你的 Chrome 插件中聲明"bookmarks"權(quán)限。具體來說,在插件清單文件(manifest.json)中添加以下內(nèi)容:

{
  "manifest_version": 2,
  "name": "你的插件名稱",
  "version": "1.0",
  "permissions": [
    "bookmarks"
  ],
  "background": {
    "scripts": [
      "bg.js"
    ]
  }
}

在上述代碼中,我們?cè)?code>"permissions"字段中聲明了"bookmarks"權(quán)限,以便我們可以使用chrome.bookmarks API。同時(shí),在"background"字段中指定了一個(gè)后臺(tái)腳本(bg.js),以便我們?cè)诤笈_(tái)執(zhí)行上述代碼。

刪除chrome瀏覽器書簽

導(dǎo)入書簽前我們需要先清除一下當(dāng)前瀏覽器的書簽,通過chrome.bookmarks.removeTree可以刪除書簽節(jié)點(diǎn)。

export function removeBookmarks(bookmarkTreeNodes) {
  // 遍歷書簽樹,刪除所有的書簽
  function traverseBookmarks(bookmarkNodes) {
    for (const node of bookmarkNodes) {
      if (node.children) {
        traverseBookmarks(node.children);
      }
      // 刪除書簽節(jié)點(diǎn)
      chrome.bookmarks.removeTree(node.id);
    }
  }
  traverseBookmarks(bookmarkTreeNodes);
}
導(dǎo)入書簽

使用chrome.bookmarks.create來新建書簽。

export function importBookmarks(bookmarkTreeNodes) {
  // 遍歷書簽樹
  function traverseBookmarks(bookmarkNodes, parentId) {
    for (const node of bookmarkNodes) {
      // 如果節(jié)點(diǎn)是文件夾
      if (node.children) {
        // 創(chuàng)建一個(gè)新的文件夾節(jié)點(diǎn)
        chrome.bookmarks.create(
          {
            parentId: parentId,
            title: node.title,
          },
          function (newFolderNode) {
            // 遞歸遍歷子節(jié)點(diǎn)
            traverseBookmarks(node.children, newFolderNode.id);
          }
        );
      }
      // 如果節(jié)點(diǎn)是書簽
      else {
        // 創(chuàng)建一個(gè)新的書簽節(jié)點(diǎn)
        chrome.bookmarks.create({
          parentId: parentId,
          title: node.title,
          url: node.url,
        });
      }
    }
  }

  // 從根節(jié)點(diǎn)開始遍歷書簽樹
  traverseBookmarks(bookmarkTreeNodes[0].children, "1");
}

插件使用

1、插件下載

直接到gitee上下載源碼即可:

源碼地址:https://gitee.com/zheng_yongtao/chrome-plug-in.git

2、導(dǎo)入插件

書簽同步插件的目錄如下:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

下載完后打開瀏覽器擴(kuò)展程序管理頁面(chrome://extensions/),選擇加載已解壓的擴(kuò)展程序:

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

選擇插件目錄導(dǎo)入即可:

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

導(dǎo)入成功后就可以看到下面這個(gè)插件了
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

可以勾選上下面這個(gè),勾選后插件就會(huì)顯示在導(dǎo)航欄上
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

3、補(bǔ)充gitee倉庫信息數(shù)據(jù)

導(dǎo)入插件后,我們點(diǎn)擊導(dǎo)航欄的插件圖標(biāo),可以看到這樣一個(gè)面板,其中有四個(gè)數(shù)據(jù)需要我們填寫:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

獲取 token

進(jìn)入到giteeAPI文檔進(jìn)行授權(quán)獲取到返回填寫即可,具體步驟如下:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

倉庫所屬空間地址(owner)

就是個(gè)人主頁的一個(gè)空間地址,如下圖:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

倉庫路徑(repo)

前面新建倉庫的路徑(倉庫名),如下圖:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

書簽文件路徑(filePath)

新建用于保存書簽數(shù)據(jù)的文件,想保存多份不同的數(shù)據(jù)的話可以多件幾個(gè)不同的文件分別進(jìn)行存儲(chǔ),同步的時(shí)候選擇對(duì)應(yīng)的目錄即可,如下圖:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

將對(duì)應(yīng)信息填寫上之后我們就可以開始進(jìn)行同步操作了:
一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件,瀏覽器擴(kuò)展插件,chrome,前端,javascript

4、同步方式

(1)覆蓋保存

使用當(dāng)前瀏覽器書簽數(shù)據(jù)覆蓋保存到gitee倉庫中。

(2)合并保存

將當(dāng)前瀏覽器書簽數(shù)據(jù)與gitee倉庫中的書簽數(shù)據(jù)合并好再進(jìn)行保存。

(3)覆蓋獲取

使用gitee倉庫中的書簽數(shù)據(jù)覆蓋掉本地的書簽數(shù)據(jù)。

(4)合并獲取

將gitee倉庫中的書簽數(shù)據(jù)和本地的書簽數(shù)據(jù)合并后再覆蓋掉本地的書簽數(shù)據(jù)。

(5)合并規(guī)則

同一層級(jí)并且同名的目錄我們會(huì)將其子節(jié)點(diǎn)合并到同一目錄下,同一層級(jí)下我們會(huì)根據(jù) 書簽名 + 書簽url 對(duì)該層級(jí)的書簽進(jìn)行去重。

源碼

1、gitee

gitee 地址:https://gitee.com/zheng_yongtao/chrome-plug-in/tree/master/chrome-bookmarks-manage

2、公眾號(hào)

關(guān)注公眾號(hào)『前端也能這么有趣』發(fā)送 chrome插件即可獲取源碼。

說在后面

?? 這里是 JYeontu,現(xiàn)在是一名前端工程師,有空會(huì)刷刷算法題,平時(shí)喜歡打羽毛球 ?? ,平時(shí)也喜歡寫些東西,既為自己記錄 ??,也希望可以對(duì)大家有那么一丟丟的幫助,寫的不好望多多諒解 ??,寫錯(cuò)的地方望指出,定會(huì)認(rèn)真改進(jìn) ??,偶爾也會(huì)在自己的公眾號(hào)『前端也能這么有趣』發(fā)一些比較有趣的文章,有興趣的也可以關(guān)注下。在此謝謝大家的支持,我們下文再見 ??。文章來源地址http://www.zghlxwxcb.cn/news/detail-719679.html

到了這里,關(guān)于一鍵同步,無處不在的書簽體驗(yàn):探索多電腦Chrome書簽同步插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 不可思議但又無處不在的漏洞,WEB安全基礎(chǔ)入門—業(yè)務(wù)邏輯漏洞

    不可思議但又無處不在的漏洞,WEB安全基礎(chǔ)入門—業(yè)務(wù)邏輯漏洞

    歡迎關(guān)注訂閱專欄! WEB安全系列包括如下三個(gè)專欄: 《WEB安全基礎(chǔ)-服務(wù)器端漏洞》 《WEB安全基礎(chǔ)-客戶端漏洞》 《WEB安全高級(jí)-綜合利用》 知識(shí)點(diǎn)全面細(xì)致,邏輯清晰、結(jié)合實(shí)戰(zhàn),并配有大量練習(xí)靶場(chǎng),讓你讀一篇、練一篇,掌握一篇,在學(xué)習(xí)路上事半功倍,少走彎路! 歡

    2024年02月02日
    瀏覽(23)
  • [小塵送書-第二期]《從零開始讀懂量子力學(xué)》由淺入深,解釋科學(xué)原理;從手機(jī)到超導(dǎo),量子無處不在;從微觀到宏觀,遐想人生的意義!

    [小塵送書-第二期]《從零開始讀懂量子力學(xué)》由淺入深,解釋科學(xué)原理;從手機(jī)到超導(dǎo),量子無處不在;從微觀到宏觀,遐想人生的意義!

    大家好,我是小塵,歡迎關(guān)注,一起交流學(xué)習(xí)!歡迎大家在CSDN后臺(tái)私信我!一起討論學(xué)習(xí),討論如何找到滿意的工作! 從微小的原子到浩瀚的宇宙,從每一滴水到閃亮的鉆石,從劃破夜空的激光到你身邊的手機(jī)……所有事物的背后都有量子力學(xué)在主宰!你看過世界級(jí)暢銷書

    2024年02月15日
    瀏覽(23)
  • 使用 github 同步谷歌瀏覽器書簽

    使用 github 同步谷歌瀏覽器書簽

    想必使用谷歌瀏覽器Chrome的用戶一定非常頭疼的一件事就是:賬戶不能登錄,書簽收藏夾不能同步,換一臺(tái)電腦書簽收藏夾沒有了! 下面教大家一招親測(cè)有效適用的方法解決書簽同步問題,在任何電腦都可以同步了 1、去下載谷歌瀏覽器 可以在百度搜索chrome或谷歌瀏覽器, 如

    2024年02月14日
    瀏覽(18)
  • 發(fā)現(xiàn)便捷,暢游互聯(lián)網(wǎng)世界——【書簽導(dǎo)航】帶你領(lǐng)略全新體驗(yàn)!

    發(fā)現(xiàn)便捷,暢游互聯(lián)網(wǎng)世界——【書簽導(dǎo)航】帶你領(lǐng)略全新體驗(yàn)!

    ? 互聯(lián)網(wǎng)世界匯聚了大量的學(xué)習(xí)資源,但是如何快速找到適合自己的學(xué)習(xí)材料卻是一項(xiàng)挑戰(zhàn)。 于是,我傾盡畢生所學(xué)強(qiáng)勢(shì)推出項(xiàng)目 【 書簽導(dǎo)航 】聚合平臺(tái),這是一個(gè)是針對(duì)廣大互聯(lián)網(wǎng)學(xué)習(xí)者的最佳導(dǎo)航和學(xué)習(xí)工具平臺(tái)。 無論你是程序員、設(shè)計(jì)師、學(xué)生,或者對(duì)任何領(lǐng)域的

    2024年02月16日
    瀏覽(16)
  • windows下Edge瀏覽器&Google Chrome與Safari雙向同步書簽

    windows下Edge瀏覽器&Google Chrome與Safari雙向同步書簽

    最近剛?cè)胧至?iPad,在上面裝了edge瀏覽器后實(shí)現(xiàn)了收藏夾,瀏覽記錄同步的問題,可是Safari瀏覽器也同樣好用,于是想體驗(yàn)一下不同系統(tǒng)之間的協(xié)同 設(shè)置和使用 Windows 版 iCloud 1 新建TXT文件,填入內(nèi)容如下: 2 修改txt文件名為.reg格式,雙擊導(dǎo)入注冊(cè)表 3 打開桌面版iCloud應(yīng)用,

    2023年04月25日
    瀏覽(15)
  • 一鍵Run帶你體驗(yàn)擴(kuò)散模型的魅力

    本文分享自華為云社區(qū)《爆圈Sora橫空出世,AGI通用人工智能時(shí)代真的要來了嗎?一鍵Run帶你體驗(yàn)擴(kuò)散模型的魅力!》,作者: 碼上開花_Lancer。 Sora這幾天的爆炸性新聞,讓所有人工智能相關(guān)從業(yè)者及對(duì)應(yīng)用感興趣的人群都感到沸騰,震撼到央視也在進(jìn)行相關(guān)的討論,簡(jiǎn)直可

    2024年03月09日
    瀏覽(15)
  • 區(qū)塊鏈開源底層軟件平臺(tái)——長(zhǎng)安鏈一鍵上鏈體驗(yàn)過程

    區(qū)塊鏈開源底層軟件平臺(tái)——長(zhǎng)安鏈一鍵上鏈體驗(yàn)過程

    長(zhǎng)安鏈作為區(qū)塊鏈開源底層軟件平臺(tái),包涵區(qū)塊鏈核心框架、豐富的組件庫和工具集,致力于為用戶高效、精準(zhǔn)地解決差異化區(qū)塊鏈實(shí)現(xiàn)需求,構(gòu)建高性能、高可信、高安全的新型數(shù)字基礎(chǔ)設(shè)施,同時(shí)也是國(guó)內(nèi)首個(gè)自主可控區(qū)塊鏈軟硬件技術(shù)體系,最近騰訊云區(qū)塊鏈,區(qū)塊鏈

    2024年02月17日
    瀏覽(20)
  • 一鍵切割,激發(fā)無限創(chuàng)意:體驗(yàn)全新圖片批量編輯器

    一鍵切割,激發(fā)無限創(chuàng)意:體驗(yàn)全新圖片批量編輯器

    在數(shù)字創(chuàng)意的時(shí)代,圖片編輯成為了表達(dá)個(gè)性和創(chuàng)造力的關(guān)鍵。然而,傳統(tǒng)的圖片編輯工具常常讓人望而生畏,復(fù)雜的操作和高門檻的技術(shù)要求使得許多人望而卻步。現(xiàn)在,我們?yōu)槟鷰硪豢钊碌膱D片批量編輯器,只需一鍵切割,就能釋放您無限的創(chuàng)意火花! “圖片批量編

    2024年03月18日
    瀏覽(28)
  • Chunjun數(shù)據(jù)同步工具初體驗(yàn)

    Chunjun數(shù)據(jù)同步工具初體驗(yàn)

    chunjun (純鈞) 官方文檔純鈞 chunjun 有四種運(yùn)行方式:local、standalone、yarn session、yarn pre-job 。 運(yùn)行方式/環(huán)境依賴 flink環(huán)境 hadoop環(huán)境 local × × standalone √ × yarn session √ √ yarn pre-job √ √ 官網(wǎng)已經(jīng)提供了編譯好的插件壓縮包,可以直接下載:https://github.com/DTStack/chunjun/releases

    2024年02月03日
    瀏覽(22)
  • WPS-AI 體驗(yàn)筆記1:一鍵生成 PPT

    WPS-AI 體驗(yàn)筆記1:一鍵生成 PPT

    WPS Win客戶端 版本:11.1.0.14650 上小節(jié)介紹了怎么獲取 WPS AI 的“入場(chǎng)券”和一些“入場(chǎng)”準(zhǔn)備工作,這一篇開始來實(shí)戰(zhàn)應(yīng)用一下。 使用 PPT 的【一鍵生成幻燈片】的功能,來制作一篇 PPT:賞析李白的經(jīng)典詩歌《靜夜思》。 接下來一起來賞析一下李白的《靜夜思》。 新建一個(gè)

    2024年02月11日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包