分类目录归档:科技

印象笔记导出Markdown

解决方案

  1. 确认印象笔记版本 9.5.10

  2. 导出笔记:

    1. 方式一:全选笔记导出为 .enex 格式。
    2. 方式二:选择笔记本导出为 .enex 格式。
  3. .enex 格式转换为 .md 格式

    方式一:

    使用 evernote2md 工具将 .enex 格式转换为 .md 格式。

    evernote2md 我的笔记.enex ./output
    

    方式二:yarle

  4. done。

获取印象笔记 9.5.10 版本安装包:

链接:https://pan.quark.cn/s/dc30a92ff0c6

提取码:jVuH

背景

已经不在使用印象笔记有几年,打算把笔记导出来,以备后用(会吗?)。

印象笔记为国内版,国际版为 Evernote。国内版的笔记从 9.5.10 版本之后是无法导出为 .enex 格式的,只能导出 .notes.html 格式,.notes 还是加密的(encoding="base64:aes"),国际版可以正常导出 .enex 格式。 evernote2md 可以将 .notes 格式转换为 .md 格式。

  • 方案1:.notes + evernote2md 🙅
  • 方案2:.html + evernote_move 🙅
  • 方案3:.enex + evernote2md
  • 方案4:.enex + yarle

方案4 yarle 优点,支持导出多种软件使用的Markdown格式(更多),如:

  • Obsidian
  • LogSeq
  • Tana
  • Heptabase

参考

  1. wormi4ok/evernote2md – Github
  2. akosbalasko/yarle – Github
  3. 印象笔记导出格式更新,enex变为notes,恶心行为+1
  4. 印象笔记导出HTML再转markdown的方法_印象笔记导出markdown-CSDN博客

Chrome 119.0.6045.199 DevTool Network UI BUG

BUG 描述

<video width="640" height="480" controls>
<source src="https://images.webclown.net/videos/Chrome%20DevTool%20BUG.mp4" type="video/mp4">
</video>

aHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vY2hyb21lL2Fuc3dlci8xODY4NTA/dmlzaXRfaWQ9NjM4Mzc1MzExMTU2NTEwODcyLTIwOTg5NjA2NjMmcD1mZWVkYmFja19jb25maXJtYXRpb24mcmQ9MQ==

BUG 修复(2023-12-14 更新)

::: warning 提示
升级到 120.0.6099.71 + 版本后,BUG 已修复。
:::

可疑邮件:企业网址域名通知函

起因

最近帮朋友维护公司相关网站,有个域名即将到期,不准备续费了,让帮忙把域名下的服务转移到另一个网站。

然后去阿里云域名服务里面查看该域名的信息,还有 200 多天过期,但是看 ESC、虚拟主机 实例里面都没有该域名解析对应的 IP。追问情况下,对方发给一张截图,说最近公司收到了这个通知函。

企业网址域名通知函

然后再仔细看图片就不太对了,域名不正常、续费价格不正常、续费年限都不对。

正常续费价格:

  • 首次购买和续费 价格一样
  • 白金域名(短域名或品牌域名),首次购买和续费均有溢价
  • 其他情况,首次购买有溢价,续费正常价格

续费年限:1-10 年 均可以续费,并不是5、10年限制

结果

抱着试试看的态度,搜索了一下「企业网址域名通知函 可疑邮件」,

企业网址域名通知函 可疑邮件 搜索结果

如果你尝试联系对方,微信对方不加,电话联系,非常热情。

参考

macOs Sonoma command + tab 无法切换窗口

问题描述

最近更新电脑(MacBook Pro)系统升级到 macOS Sonoma,在使用过程中发现下面的问题,忍受了一段时间,最终还是决定解决一下。

全屏应用、非全屏应用这两种应用,在使用 command + tab 切换应用的时候,捷键的指令已经执行完毕,应用状态也已经切换了,但是无法“聚焦切换”到对应的应用上。

图1:全屏应用、非全屏应用这两种应用,在使用 command + tab 切换应用的时候,捷键的指令已经执行完毕,应用状态也已经切换了,但是无法“聚焦切换”到对应的应用上。

解决方案

最终在系统设置中找到了解决方案,如下图所示:

图2:切换到某个应用程序时,会切换到包含该应用程序的打开窗口的空间

设置入口:

  1. 屏幕左上角「🍏」 > “系统设置”,
  2. 点按边栏中的“桌面与程序坞” ,前往右侧的“调度中心”,
  3. 然后打开“切换到某个应用程序时,会切换到包含该应用程序的打开窗口的空间”。

官方解释:

图3:切换到某个应用程序时,会切换到包含该应用程序的打开窗口的空间

图4:When switching to an application, switch to a Space with open windows for the application

参考资料

怎么区分Arc浏览器和Chrome浏览器

背景

在给 Workflows 页面里面的 Chrome 书签,添加 快速使用示例代码 时,发现在 Arc 浏览器里面,无法正常使用,而在 Chrome 浏览器里面可以正常使用。

看看怎么区分一下 Arc 浏览器和 Chrome 浏览器,然后在 Arc 浏览器不给提示。

快速使用示例代码

查看两个浏览器的 User Agent,一毛一样:

Arc 浏览器:

Arc Browser User Agent

> navigator.userAgent
< 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'

Chrome 浏览器:

Chrome Browser User Agent

> navigator.userAgent
< 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'

解决方案

搜索找到了这篇文章:Can JavaScript detect the Arc browser? – Stack Overflow

根据这篇文章里面的提示,可以通过 获取 Arc 浏览器 的 User Agent Atylesheet(浏览器默认样式) 来区分 Arc 浏览器和 Chrome 浏览器。

User Agent Atylesheet(浏览器默认样式)

:root {
    --arc-palette-cutoutColor: #ECEDFEFF;
    --arc-palette-backgroundExtra: #FDFDFFFF;
    --arc-palette-minContrastColor: #ECEDFEFF;
    --arc-palette-hover: #D3D4FDFF;
    --arc-palette-background: #E9EAFEFF;
    --arc-palette-focus: #9094FBFF;
    --arc-palette-foregroundPrimary: #3139FBFF;
    --arc-palette-maxContrastColor: #212AFBFF;
    --arc-background-gradient-color0: #C8CAFEFF;
    --arc-palette-subtitle: #A6AAFBFF;
    --arc-palette-foregroundSecondary: #8489FBFF;
    --arc-palette-foregroundTertiary: #ECEDFEFF;
    --arc-background-gradient-color1: #FFE6E6FF;
    --arc-palette-title: #0A0D4BFF;
}

只判断是否有值其中一个变量存在就可以了。

<script setup lang="ts">
import { onMounted, ref } from 'vue'
const isArcBrowser = ref(false);

onMounted(() => {
  isArcBrowser.value = getComputedStyle(document.documentElement)
    .getPropertyValue('--arc-palette-title') ? true : false;
  console.log('isArcBrowser', isArcBrowser.value);
});
</script>

参考

  1. Can JavaScript detect the Arc browser? – Stack Overflow

Workflows with Alfred

caniuse

willfarrell/alfred-caniuse-workflow: Alfred App Workflow for caniuse.com

alfred-caniuse-workflow

cdnjs

Alfred 3 workflow to search libs on cdnjs

chitacan/alfred-cdnjs

alfred-cdnjs

Chrome 书签

bayleedev/alfred-chrome-bookmarks: :bookmark: Fast Chrome bookmark searcher for Alfred.

alfred-chrome-bookmarks

Font Awesome

ruedap/alfred-font-awesome-workflow: 🎩 Font Awesome workflow for Alfred

alfred-font-awesome-workflow

GitHub

willfarrell/alfred-github-workflow: Searching Github repos.

alfred-github-workflow

gitignore

jdno/alfred-gitignore: Create .gitignore files using Alfred

alfred-gitignore

Hash

willfarrell/alfred-hash-workflow: Hashing Strings

alfred-hash-workflow

MDN Search

alfred-workflows/mdn-search at main · gilbarbara/alfred-workflows

mdn-search

Open url in Browser

linxz/alfredWorkflow-Open-url-in-Browser-without-http: 自从用了alfred后,比较依赖这个东西,然后很多时候都是直接通过这个打开浏览器的……无意间发现其实可以同时打开多个,于是稍微调整一下……

Open url in Browser

Package Repo Search

willfarrell/alfred-pkgman-workflow: Package Repo Search

所有命令

Package Repo Search

Youdao Translator

wensonsmith/YoudaoTranslator: Alfred Youdao Translate Workflow

YoudaoTranslator

WiFi Workflow

ravelll/wifi-workflow: A Alfred workflow to simply control Wi-Fi setting on macOS.

wifi-workflow

Workflows with Chrome

Chrome 书签

以下是一些常用的 Chrome 书签,使用步骤:

如何使用

  1. 手动创建书签

    1. 新建书签 新建书签
    2. 使用以下代码替换 URL 使用以下代码替换 URL
    3. 执行 执行
  2. 快速使用示例代码

    1. Chrome、Firefix 直接拖拽到书签栏即可
    2. Safari(我的浏览器版本是:17.0 (19616.1.27.111.16)
      1. 设置-高级-【勾选】显示网页开发者功能
      2. 设置-开发者-【勾选】允许在智能搜索栏中使用 JavaScript
      3. 拖拽 快速使用示例代码 到书签栏即可

TAPD 项目管理 计算花费工时

  1. 工作台 – 仪表盘 – 添加卡片 – 统计工时时长 – 选择项目 – 选择时间 – 生成卡片
  2. 查看全部
  3. 点击书签栏中的 TAPD 项目管理 计算花费工时 即可
javascript: (function () {
    var arr = [];
    var totalTime = 0;
    var trs = document.querySelectorAll('.g_table_autowidth tbody tr');
    var name = document.querySelector('h3.name span').innerText;

    for (let index = 0; index < trs.length; index++) {
        let tr = trs[index];
        let tds = tr.querySelectorAll('td');
        if (tds.length === 8) {
            tds[0].remove();
            tds[1].remove();
            tds[2].remove();
        } else if (tds.length === 6) {
            tds[0].remove();
        }
    }


    var trs = document.querySelectorAll('.g_table_autowidth tbody tr');

    for (let index2 = 0; index2 < trs.length; index2++) {
        let tr = trs[index2];
        let tds = tr.querySelectorAll('td');
        if (!arr.length && tds[0].innerText) {
            totalTime += Number(tds[1].innerText);
            arr.push({
                project: tds[0].innerText,
                countTime: Number(tds[1].innerText)
            });
        } else if(arr.length && tds[0].innerText) {
            var arrExistIndex = arr.findIndex((item) => item.project === tds[0].innerText);
            if (arrExistIndex !== -1) {
                totalTime += Number(tds[1].innerText);
                arr[arrExistIndex].countTime += Number(tds[1].innerText);
            } else {
                totalTime += Number(tds[1].innerText);
                arr.push({
                    project: tds[0].innerText,
                    countTime: Number(tds[1].innerText)
                });
            }
        }
    }
    var str = '';
    for (let index3 = 0; index3 < arr.length; index3++) {
        var {project, countTime} = arr[index3];
        
        var zanbi = (countTime/totalTime * 100).toFixed() / 100;
        str += `${project}\t${countTime}\t${ zanbi ? `${name}${(Math.round(zanbi * 10) / 10)}` : '' }\n`;
    }
    str += ` \t${totalTime}`;
    prompt("复制粘贴到 Excel 中", str);
})();

Yapi body 参数 转换为 JSDoc 注释

  1. 打开 Yapi 项目
  2. 选择接口
  3. 点击书签栏中的 Yapi body 参数 转换为 JSDoc 注释 即可
javascript: (function () {
    function contains(selector, text) {
        var elements = document.querySelectorAll(selector);
        return Array.prototype.filter.call(elements, function(element){
            return RegExp(text).test(element.textContent);
        });
        }
    function capitalizeFirstLetter(string) {
        return string.charAt(0).toUpperCase() + string.slice(1);
    }

    var trs1 = document.querySelector('.panel-view');

    var apiName = trs1.querySelector('.row .colName').innerText;

    var trs = contains('div', /^Body/)[0].querySelectorAll('.ant-table-tbody tr');

    console.log('trs', trs)

    var str = `/**\n * ${ apiName }\n`;

    for (let index = 0; index < trs.length; index++) {
        let tr = trs[index];
        let tds = tr.querySelectorAll("td");

        str += ` * @param {${ capitalizeFirstLetter(tds[1].innerText) }} data.${ tds[0].innerText } ${ tds[4].innerText }\n`;
    }

    str += ` * @url ${ window.location.href }\n * @returns Promise\n */`;

    var x = document.createElement("DIALOG");
    var t = document.createTextNode(str);

    x.appendChild(t);
    x.style = "white-space: pre;"
    
    document.body.appendChild(x);
    
    x.addEventListener('copy',function(e){
        setTimeout(() => {
            x.hidden = true;
            x.remove();
        }, 320);
    });
    
    x.showModal();
})();

批量删除 Snapmail.cc 单个邮箱内的邮件

www.snapmail.cc

  1. 打开 Snapmail.cc
  2. 选择邮箱
  3. 点击书签栏中的 批量删除 Snapmail.cc 单个邮箱内的邮件 即可
javascript: (function () {
    var lis = document.querySelectorAll('.email-container .sidebar-scrollable-content .email-list li[ng-repeat="item in filtered = (items | orderBy:\'time\':!reverse | filter: search) "]');

    for (let index = 0; index < lis.length; index++) {
        const emailId = lis[index].querySelector('a').getAttribute('href').split('#/email/')[1];

        fetch(`https://www.snapmail.cc/email/${emailId}`, {
        "headers": {
            "accept": "application/json, text/plain, */*",
            "accept-language": "zh-CN,zh-TW;q=0.9,zh;q=0.8,ja-JP;q=0.7,ja;q=0.6,en-US;q=0.5,en;q=0.4,ko-KR;q=0.3,ko;q=0.2",
            "cache-control": "no-cache",
            "pragma": "no-cache",
            "sec-ch-ua": "\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Google Chrome\";v=\"116\"",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": "\"macOS\"",
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "same-origin"
        },
        "referrer": "https://www.snapmail.cc/",
        "referrerPolicy": "strict-origin-when-cross-origin",
        "body": null,
        "method": "DELETE",
        "mode": "cors",
        "credentials": "include"
        }).then(res => {
            return res.json()
        });
    }
})();

公众号文章信息

  1. 打开公众号文章
  2. 点击书签栏中的 公众号文章信息 即可
  3. 自动复制内容到剪切板
javascript: (function () {
    function getarticleInfo() {
        let obj = {};
    
        obj['title'] = msg_title || document.title;
        obj['content'] = msg_desc || "";
        obj['author'] = title || "";
        obj['createTime'] = document.querySelector('#publish_time').innerText || new Date().getTime();
        obj['image'] = msg_cdn_url || "";
        obj['blankUrl'] = location.href;
    
        return JSON.stringify(obj, null, 2);
    }
    
    setTimeout(() => {
        navigator.clipboard.writeText(`${getarticleInfo()},`);
    }, 320);
})();

结果内容:

{
  "title": "主播说联播丨大胆闯、大胆试、自主改!",
  "content": "",
  "author": "央视新闻",
  "createTime": "2023-09-26 22:47",
  "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/oq1PymRl9D6Ok0VQvMrI5flK4zRNtnQCKkXwibaq19DHGTCKjaneibGV9Dw7IRzIFDp8ru3ekovHuCE3xSsDPDuQ/0?wx_fmt=jpeg",
  "blankUrl": "https://mp.weixin.qq.com/s/ppTuriLssKstpWL-yqe9HA"
},

公众号文章封面图

  1. 打开公众号文章
  2. 点击书签栏中的 公众号文章封面图 即可
  3. 自动打开两个窗口:1、正方形(1:1) 2、长方形(2.35:1
javascript: (function () {
    cdn_url_1_1 && window.open(cdn_url_1_1);
    msg_cdn_url && window.open(msg_cdn_url);
})();

快速使用示例代码: 拖拽 ta 到 书签栏 👉 <a class="js-drag" href="javascript: (function () {
cdn_url_1_1 && window.open(cdn_url_1_1);
msg_cdn_url && window.open(msg_cdn_url);
})();">公众号文章封面图</a>

统计美团外卖订单金额大于30元的订单

  1. 打开美团外卖订单详情
  2. https://h5.waimai.meituan.com/waimai/mindex/olist
  3. 点击书签栏中的 统计美团外卖订单金额大于30元的订单 即可
javascript: (function () {
    const lis = document.querySelectorAll('div[class^="orderList"] li')
    const 订单列表 = [];
    const 金额 = 30;
    for (let index = 0; index < lis.length; index++) {
        // console.log(lis[index].innerText)
        var li = lis[index];
        var 单个订单金额 = li.querySelector('.price_Ul_Wom').innerText.split('实付¥')[1] * 1;
        if (单个订单金额*1 >= 金额) {
            订单列表.push({
                日期: li.querySelector('*[class^="time"]').innerText.split('\n')[0],
                订单号: li.querySelector('div[class^="orderWrap"]').dataset.id.split('id')[1],
                商家: li.querySelector('*[class^="name"]').innerText,
                金额: li.querySelector('.price_Ul_Wom').innerText.split('实付¥')[1]
            })
        }
    }
    setTimeout(() => {
        navigator.clipboard.writeText(`${JSON.stringify(订单列表.reverse(), null, 2)}`);
    }, 320);
})();

结果内容:

[
  {
    "日期": "2023-01-01 00:00",
    "订单号": "8888888888888888888",
    "商家": "麦当劳&麦咖啡(北京西大望路店)",
    "金额": "30.0"
  }
]

统计美团外卖在某个商家下的订单

小商家,订单满100,1000,统一开发票,需要统计订单

  1. 打开美团外卖订单详情
  2. https://h5.waimai.meituan.com/waimai/mindex/olist
  3. 点击书签栏中的 统计美团外卖在某个商家下的订单 即可
javascript: (function () {
    var lis = document.querySelectorAll('div[class^="orderList"] li')
    const 订单列表 = []
    const 商家 = '门框卤煮(双井店)';
    for (let index = 0; index < lis.length; index++) {
        // console.log(lis[index].innerText)
        var li = lis[index]
        if (商家 === li.querySelector('*[class^="name"]').innerText) {
            订单列表.push({
                日期: li.querySelector('*[class^="time"]').innerText.split('\n')[0],
                订单号: li.querySelector('div[class^="orderWrap"]').dataset.id.split('id')[1],
                金额: li.querySelector('.price_Ul_Wom').innerText.split('实付¥')[1]
            })
        }
    }
    setTimeout(() => {
        navigator.clipboard.writeText(`${JSON.stringify(订单列表.reverse(), null, 2)}`);
    }, 320);
})();

当前页面以窗口形式打开

  1. 打开页面(浏览器非全屏模式下)
  2. 点击书签栏中的 当前页面以窗口形式打开
  3. 输入窗口宽度:默认 540
  4. 输入窗口高度:默认 800
javascript: (function () {
    var defaultWidth = 540, defaultHeight = 800;
    var openWindowWidth = window.prompt('窗口宽度(width)', defaultWidth);
    var openWindowHeight = window.prompt('窗口高度(height)', defaultHeight);
    var screenHeight = window.screen.height;
    var screenWidth = window.screen.width;
    var screenX = (screenHeight - openWindowHeight) / 2;
    var screenY = (screenWidth - openWindowWidth) / 2;
    var windowFeatures = 'height='+ openWindowHeight +', width=' + openWindowWidth + ', top=' + screenX + 'px, left=' + screenY + 'px, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no';
    
    window.open(window.location.href, 'newwindow', windowFeatures);
})();
  • toolbar:工具栏
  • menubar:菜单栏
  • scrollbars:滚动条
  • resizable:是否可以调整窗口大小
  • location:是否显示地址栏
  • status:是否显示状态栏

生成二维码

依赖 2.webclown.net

  1. 打开页面
  2. 点击书签栏中的 生成二维码
  3. 自动打开新窗口,显示二维码
javascript: (function () {
    var baseUrl = 'http://2.webclown.net/?';
    var url = baseUrl + 'url=' + encodeURIComponent(location.href);
    window.open(url);
})();

快速使用示例代码: 拖拽 ta 到 书签栏 👉 <a class="js-drag" href="javascript: (function () { var baseUrl = ‘http://2.webclown.net/?’; var url = baseUrl + ‘url=’ + encodeURIComponent(location.href); window.open(url); })();">生成二维码</a>

复制转载信息

  1. 点击书签栏中的 复制转载信息
  2. 自动复制内容到剪切板
javascript: (function () {
    navigator.clipboard.writeText('[' + document.title + '](' + window.location.href + ')');
})();

快速使用示例代码: 拖拽 ta 到 书签栏 👉 <a class="js-drag" href="javascript: (function () { navigator.clipboard.writeText(‘[‘ + document.title + ‘](‘ + window.location.href + ‘)’);})();">复制转载信息</a>

生成短网址

  1. 点击书签栏中的 生成短网址
  2. 自动复制内容到剪切板
javascript: !(function () {
    var myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/json");
    
    var raw = JSON.stringify({
      longUrl: window.location.href,
    });
    
    var requestOptions = {
      method: "POST",
      headers: myHeaders,
      body: raw,
      redirect: "follow",
    };
    
    fetch("https://00s.top/api/shorten", requestOptions)
      .then((response) => response.json())
      .then((result) => {
        if (result.shortUrl) {
          const link = "https://00s.top/" + result.shortUrl;
          const dialog = document.createElement("dialog");
          dialog.innerHTML =
            "<div class='position: fixed;top: 1em;right: 1em;background: #fff;'><p style='text-align: center; padding: 1em; background: #1d91eb; color: #fff;'>短网址已生成:(自动复制)</p><p style='padding: 1em;'>" +
            link +
            "</p></div>";
          document.body.appendChild(dialog);
          dialog.showModal();
          navigator.clipboard.writeText('[' + document.title + '](' + link + ')');
          setTimeout(() => dialog.close(), 2000);
        }
      })
      .catch((error) => {
          const dialog = document.createElement("dialog");
          dialog.innerHTML =
            "<div class='position: fixed;top: 1em;right: 1em;background: #fff;'><p style='text-align: center; padding: 1em; background: #1d91eb; color: #fff;'>生成失败</p><p style='padding: 1em;'>当前站点禁止使用书签脚本,请访问:https://00s.top 生成。</p><form method='dialog'><button>关闭</button></form></div>";
          document.body.appendChild(dialog);
          dialog.showModal();
      });
})();

生成短网址:成功

生成短网址:失败

英文中的连字符和下划线

英文中的连字符(-)和下划线(_)

起因

下面两种命名方式,在编辑器双击 button_height 全部选中,编辑器双击 button-height 不能全部选中,编辑器为什么这样设计?

  1. button-height
  2. button_height

在 页面仔 群问了一下,得到了答案:

linxz:因为 – 是连字符

linxz:从英文单词的角度去考虑,这里算是两个单词

linxz:而双击选中一般是选择单词,中文是选择词

连字符(hyphen)

牛津词典

  • 将多个或更多的词组成复合词
    • hard-hearted(铁石心肠)
    • fork-lift truck(叉车)
    • mother-to-be(孕妇)
  • 将前缀和转悠名词组成复合词
    • pre-Raphaelite(前拉斐尔派)
    • pre-European(欧洲前史)
  • 书写21-99之间的复合数字时
    • seventy-three(73)
    • thirty-one(31)
  • 有时用在英式英语中用以将以元音结尾的前缀与以相同元音开始的词隔开
    • co-operate(合作)
    • pre-eminent(卓越的)
  • 转行时用于单词的前半部分之后

下划线(underscore)

牛津词典 中 这个不算标点符号,在这个单词 underscore 的释义下说明:下划线、底线,用于字母下划线或计算机命令和互联网网址中。

在计算机中,一般用于不允许出现空格的地方,比如:

  • 文件名
    • The_Dark_Knight_2008_1080p.mkv
  • 变量名
    • const MAX_LENGTH = 100;
  • 函数名
    • function get_user_info() {}
  • 等等

拓展

如何配置编辑器(Visual Studio Code),使得双击 button-height 全部选中?

  1. 打开 settings.json 文件
  2. 添加/编辑如下配置
    {
        ...
        // "editor.wordSeparators": "`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?", // 默认配置,去掉 -
        "editor.wordSeparators": "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?",
        ...
    }
    
  3. 保存配置文件,即可

更多配置阅读查看:Visual Studio Code User and Workspace Settings

参考

  1. 如何使用英文连字符 – Wordvice Blog
  2. Underscore | Punctuation | Grammar | Glossary | Ultius
  3. Underscore – Wikipedia
  4. underscore, n. meanings, etymology and more | Oxford English Dictionary
  5. 牛津词典

获取统计相关免费数据源

Trading Economics

https://tradingeconomics.com/

世界银行

https://www.worldbank.org/en/home

Our World in Data

https://ourworldindata.org/

OECD

https://data.oecd.org/

IMF

https://www.imf.org/en/Data

中国统计局

http://www.stats.gov.cn/

TIPS

尽可能查找一手信息,一手信息的价值远远大于二手信息。

  • 一个国家数据
    • GDP
    • CPI
    • 就业率
    • ……
  • 一个公司
    • 公司年报
    • 创始人访谈
    • ……

在 macOS 上安装 Photoprism

目的

二次开发 或 贡献代码(Contribution)

准备

  • 系统:macOS Ventura 13.3.1 (22E261)(M1 Pro)
  • git
  • make
  • docker & docker-compose
  • nodejs

开始

参照官方文档:Setting Up Your Development Environment

1、克隆仓库

git clone git@github.com:photoprism/photoprism.git

cd photoprism

2、启动本地开发环境

make docker-build

docker compose up

# 或 后台进程
# docker compose up -d

3、安装依赖

make terminal

make dep

make build-js

make build-go

./photoprism start

完成

执行到这一步基本上就完成。

  • http://localhost:2342
  • https://localssl.dev

账号密码去 docker-compose.yml 文件里面环境变量(environment)处寻找。

  • 账号KEY: PHOTOPRISM_ADMIN_USER
  • 密码KEY: PHOTOPRISM_ADMIN_PASSWORD

遇见问题

问题一:docker compose up 无法正常安装 tensorflow lib 库

执行 docker compose up 时有一个步骤需要安装 tensorflow lib 库,我这边碰见一个问题是,

安装了一个不存在的版本:https://dl.photoprism.app/tensorflow/arm64/libtensorflow-arm64-auto-1.15.2.tar.gz,连接上多了一个 auto

正确版本应该是:https://dl.photoprism.app/tensorflow/arm64/libtensorflow-arm64-1.15.2.tar.gz

修改一下这个文件的68行: scripts/dist/install-tensorflow.sh:68,删除选中的代码即可。

临时删除(-${TF_DRIVER})

是否正确,需要去这个网站查看下是否有对应的源文件:https://dl.photoprism.app/tensorflow/arm64

问题二:make build-go 安装慢

make build-go 安装慢,可以设置代理(阿里云):

export GO111MODULE=on
export GOPROXY=https://mirrors.aliyun.com/goproxy/
make build-go