0%

独立开发者的 Logo 制作记录

最近做了个一站式 AI 生图工具Typix,需要设计一个 Logo,作为一个完全没有设计基础的程序员,我摸索出了一套简单实用的方法,记录下来分享给同样需要的朋友。

这个方法主要用到了 AI 生成 + 网页工具处理。

阅读全文 »

背景

在开发 flutter 项目时,经常会用到一些图标,这些图标通常是从一些图标库中下载下来的,然后需要把图标svg格式转换成flutter项目中的icon font,这个过程是比较繁琐的,而且如果图标库中的图标有更新,那么还需要手动去下载新的图标,然后再转换,在有了fluttericon.com这个网站之后,这个过程就变得非常简单了。

阅读全文 »

假设有一个第三方库,我们引用了它并且调用了它的方法,然后我们需要拿到这个方法的返回类型作为我们一个公共函数的参数类型,例如:

1
2
3
4
5
6
7
8
9
10
import { Innertube } from "youtubei.js";

const innertube = await Innertube.create();
const video = await innertube.getBasicInfo("video_id");
handleVideo(video);

// 注意这里的VideoInfo是getBasicInfo的返回类型,这里并没有拿到
function handleVideo(video: VideoInfo) {
// do something
}

这个时候可能就会有人说,很简单啊直接Ctrl + 点击进去方法看一下返回类型不就行了吗?,好的那我们点进getBasicInfo看下:

阅读全文 »

假设有一个结构体来表示用户信息:

1
2
3
4
5
6
type User struct {
Name string `json:"name"`
Sex string `json:"sex"`
Age int `json:"age"`
Vip bool `json:"vip"`
}

然后有个需求是展示给用户的名称要根据用户的性别VIP来生成,比如说:

  • 如果用户是 VIP,那么展示 尊贵的 + 名字 + 先生/女士
  • 如果用户不是 VIP,那么展示 名字 + 先生/女士

这个时候一般会有个做法,在结构体中加一个字段:

1
2
3
4
5
6
7
8
9
10
11
12
type User struct {
Name string `json:"name"`
Sex string `json:"sex"`
Age int `json:"age"`
Vip bool `json:"vip"`
DisplayName string `json:"display_name"`
}

// 实现一个方法来设置 DisplayName 字段
func (u *User) SetDisplayName() {

}

然后在每次更新NameSexVip的时候调用SetDisplayName方法来更新DisplayName字段,或者在序列化的时候调用SetDisplayName方法来更新DisplayName字段,这样做是没问题的,但是非常的不利于维护,要到处硬编码调用SetDisplayName方法,非常容易遗漏,那么有没有什么优雅的方式来解决这个问题呢?答案是有的,下面来介绍一下。

阅读全文 »

最近发现了一个沉浸式翻译的神奇功能,就是在输入框输入中文的时候敲三下空格就可以自动翻译成英文,这功能真的挺方便的,效果如下图:

这直接引起了我的好奇心,要知道模拟文本输入是一个很麻烦的事情,记得之前有一次我想用油猴来做一个discord自动发消息水经验的脚本,但是卡在了模拟输入这一步,最后就放弃了。

于是就去discord试了下沉浸式翻译的这个功能,发现是可以正常运作的,这我就不得不好好研究下了。

阅读全文 »

前言

之前把gopeed项目升级到go1.21版本后,发现gomobile编译完后,在 flutter ios 端编译会报错,如下:

1
2
3
4
5
6
7
8
9
ld: Undefined symbols:
_res_9_nclose, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_ninit, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_nsearch, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然后我在gogithub里找到了这个issue,但是看到这个@bcmills哥们的回复感觉太麻烦了就用了后面@dreacot老哥的解决方案,编译的时候加上-tags netgo

1
gomobile bind -target=ios -tags netgo

然后就可以正常编译了,因为我自己没有ios设备,就没有测试过,按理说编译通过了应该就没问题了,然而最近 github 上好多用户都在反馈 ios 端无法正常使用,附上一个issue,看起来都是DNS解析的问题,起初以为是用户的网络问题,但是随着越来越多的用户反馈,这肯定就不是单纯的用个例问题了,于是又重新开始研究@bcmills哥们的解决方案。

阅读全文 »

前言

之前苦于github action不支持macOS arm架构,导致我为了打gopped macos包煞费苦心,我在 linux 上用xgo交叉编译出来macos arm64的动态库,然后在macOS x64上再打包成macos amd64的动态库,最后把两个架构的动态库合并成一个universal binary包,来同时支持IntelApple Silicon架构,如今github action终于支持macOS arm架构了,这下可以省去很多麻烦了。

阅读全文 »

不知道从什么时候开始,新写的文章阅读数量一直是1,一直没有去管,今天把问题解决了,记录下希望能帮到有同样问题的人。

问题原因

Next 中内置的leancloud_visitors插件是用leancloud存储功能来实现的,类似一个mongodb,不知道什么时候开始默认把权限变成了只读,所以每次更新统计数的时候都会报403权限问题,通过网络请求可以看到:

阅读全文 »

前言

前一段时间给我的开源下载器 Gopeed 实现了一套扩展系统,相关设计草案可以在这里查看,基于这套扩展系统可以很方便的通过javascript来实现一些定制化的功能,目前已经实现的扩展有:

然后重点是这些扩展也是全平台支持的,这意味着你可以在windowsmaclinuxandroidiosweb平台上安装和使用这些扩展,是不是很酷?接下来就来介绍下我是如何实现这套扩展系统的。

阅读全文 »