Logo

site iconSunZhongWei | 孙仲维

博客名「大象笔记」,全干程序员一名,曾在金山,DNSPod,腾讯云,常驻烟台。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

SunZhongWei | 孙仲维 RSS 预览

ssh: connect to host github.com port 22: Resource temporarily unavailable

2025-01-21 12:08:45

从昨天晚上开始,发现无法直接拉取 github 上的代码仓库了。报错如下:

ssh: connect to host github.com port 22: Resource temporarily unavailable
fatal: Could not read from remote repository.

Please make sure you have the correct access rights

我以为我的 github 账号权限出了问题。

但是换成 https 协议,会报:

Failed to connect to github.com port 443: Connection refused

说明还是网络问题。

判断 github 的 DNS 解析问题

> nslookup github.com
Server:         114.114.114.114
Address:        114.114.114.114#53

Non-authoritative answer:
Name:   github.com
Address: 20.205.243.166

参考:

https://www.v2ex.com/t/1009169

GitHub 在国内会被解析到新加坡节点的 20.205.243.166 ,这个 IP 在全国范围内被空路由了,其他 GitHub 的 IP 暂时没事,也可能只是策略还没分发完毕

解决方案

打开配置文件 ~/.ssh/config 添加:

# add
Host github.com
  Hostname ssh.github.com
  Port 443

然后,就能正常的拉取 github 代码了。

在国内写代码太痛苦了,搞得跟个小偷一样 🤣

Nginx 配置支持 mjs 文件的加载

2025-01-17 16:33:25

用 Nginx 部署了一个前端项目,发现 pdf.js 相关的功能异常。 从浏览器的 console 来看,报错信息如下:

Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.

参考:

https://github.com/mozilla/pdf.js/issues/17296

在前端配置中增加 mjs 相关的配置即可。

server {
    # ...

    location / {
        root   /usr/share/nginx/html;
        index  index.html;

        location ~* \.mjs$ {
            # target only *.mjs files
            # now we can safely override types since we are only
            # targeting a single file extension.
            types {
                text/javascript mjs;
            }
        }
    }
}

mjs 和 js 的区别

mjs 即,MJS(ECMAScript Modules in JavaScript)使用 .mjs 作为文件扩展名,以明确表示该文件使用 ECMAScript 模块系统。

React Native 获取当前手机系统语言,或者浏览器语言

2025-01-16 10:01:50

之前开发 app 都是基于手机系统 locale 实现多语言翻译就行。

但是在 AI 横行的时代,又多了一项需求,就是根据手机系统的语言,自动返回对应语言的聊天内容。

这样就需要传递一个语言参数给后台接口。

languageCode

An IETF BCP 47 language tag without the region code. Example: 'en', 'es', 'pl'.

而 locale 则是 languageCode 和 regionCode 的组合。例如 en-US, zh-CN. 当然还有其他的 code 组合。

安装 expo-localization 依赖

在 React Native 项目下执行:

npx expo install expo-localization

这个库同时支持 android, ios 和 web。

代码

import { getLocales } from 'expo-localization';

const language = getLocales()[0].languageCode;  // en / es

getLocales 返回的数据格式:

[{
  "languageTag": "pl-PL",
  "languageCode": "pl",
  "textDirection": "ltr",
  "digitGroupingSeparator": " ",
  "decimalSeparator": ",",
  "measurementSystem": "metric",
  "currencyCode": "PLN",
  "currencySymbol": "zł",
  "regionCode": "PL",
  "temperatureUnit": "celsius"
}]

参考

https://docs.expo.dev/versions/latest/sdk/localization/

React Native Gifted Chat 显示 vimeo 视频

2025-01-12 11:32:21

vimeo 插件

https://www.npmjs.com/package/react-native-vimeo-iframe

renderMessageVideo

但是直接使用 Vimeo 组件,会报错:

Video is not implemented by GiftedChat. You need to provide your own implementation by using renderMessageVideo prop.

于是增加了 gifted chat 的自定义方法:

renderMessageVideo

WebView not support

增加了 renderMessageVideo 还是报错:

React Native WebView does not support this platform.

npm install react-native-webview

react-native-webview 仅支持移动平台,不支持 Web 平台。对于 Web 平台,可以使用 iframe 来嵌入 Vimeo 视频。

所以区分 Platform 做不同处理:

  • web 端,继续沿用之前的 react 逻辑,使用自己封装的 iframe 组件
  • app 端,则使用三方的 Vimeo 组件

代码

const renderMessageVideo = (props: any) => {
    const { currentMessage } = props
    if (currentMessage.video) {
      if (Platform.OS === 'web') {
        return (
          <div>
            <div>
              <iframe
                title="Some Video"
                src="https://player.vimeo.com/video/xxx"
                frameborder="0"
                width="300"
                height="361"
                allow="autoplay; fullscreen; picture-in-picture"
                allowfullscreen
              ></iframe>
            </div>
            <script src="https://player.vimeo.com/api/player.js"></script>
          </div>
        );
      } else {
        return (
          <Vimeo
              videoId={'xxx'}
              params={'api=1&autoplay=0'}
          />
        )
      }
    }
    return null
  }

  return (
    <GiftedChat
      messages={messages}
      onSend={msgs => onSend(msgs)}
      user={user}
      onQuickReply={handleQuickReply}
      renderMessageText={renderMessageText}
      renderMessageVideo={renderMessageVideo}
      renderTime={renderTime}
    />
  )

React Native Gifted Chat 中渲染 Markdown 消息

2025-01-11 22:41:18

晚上实现了 React Native Gifted Chat 中渲染 Markdown 消息,折腾完之后,我甚至感觉 React Native 的库比 React 的库都可靠。

安装依赖

https://www.npmjs.com/package/react-native-markdown-display

npm install react-native-markdown-display

会看到安装了最新版本的依赖

git diff .\package.json

+    "react-native-markdown-display": "^7.0.2",

是否支持 web

主要是被官方介绍吓到了:

It a 100% compatible CommonMark renderer, a react-native markdown renderer done right. This is not a web-view markdown renderer but a renderer that uses native components for all its elements. These components can be overwritten and styled as needed.

我以为不支持 web view。

npm run web

的演示结果看,是支持 web 的。

如何渲染返回信息中的 markdown 内容

新增一个自定义的 renderMessageText 方法,然后在新建的 message 消息中,增加一个 markdown 字段,bool 类型。 如果这个值为真,就进入 markdown 的渲染逻辑:

import { GiftedChat, MessageText } from 'react-native-gifted-chat'
import { Platform, View, Text } from 'react-native'
import Markdown from 'react-native-markdown-display'

+  const renderMessageText = (props: any) => {
+    const { currentMessage } = props
+    if (currentMessage.markdown) {
+      return (
+        <View>
+          <Markdown>{currentMessage.text}</Markdown>
+        </View>
+      )
+    }
+    return <MessageText {...props} />
+  }
+
   return (
     <GiftedChat
       messages={messages}
       onSend={msgs => onSend(msgs)}
       user={user}
       onQuickReply={handleQuickReply}
+      renderMessageText={renderMessageText}
     />
   )
 }

如何跟 github copilot 合作

这是第一次比较完整的跟 github copilot 合作完成一个功能的案例,所以有必要记录一下。 之前都是大部分靠自动补全实现的。而这次靠补全是很难完成的,看来 copilot pro 充值还是物有所值的

完整的提问过程:

  1. 如何渲染返回的 custom 信息中的 markdown 内容
  2. 上面的实现有点问题,会把所有消息都当作 markdown 处理。而我需要的是对某些特定消息做 markdown 渲染
  3. renderMessageText 如何沿用默认的样式

如果采用习惯性的做法,会先去 Google 找 React Native 支持 Markdown 渲染的库。 但是搜索结果优先推荐了一个多年不维护的库,而直接问 github copilot 则会推荐一个更为活跃,也更多采用的上面这个库。

再就是,第一次提问,给出的解决方案,并不好。因为没有考虑到其他消息类型。

我第一反应是,继续去 google 搜索,自己寻求答案。但是,期间我去打洗脚水,突然相对,为何不能继续引导 AI 给出更合理的解决方案呢?

于是又出现了后面第二个,第三个问题。最后给出的代码就能直接使用了。非常棒。