狂人山庄 Madman Hills

A man entering midage

税务

如何注册EU OSS VAT税号

为什么要欧盟的OSS VAT税号 大家都知道,欧洲福利高,待遇好。但是,高福利是基于高税收的基础上。特别是欧盟国家有增值税(VAT),分别在15%-27%之间。 大家可能会说,OK,那我知道了。但这个跟我有什么关系?我的公司又不成立在欧盟,收税跟我没什么关系吧? 那,这就错了。事实上,除非你的商品/软件不卖给欧盟国家的人,不然,VAT还是跟你息息相关的。 为什么?因为欧盟税收是根据目的地原则,也就是说,VAT在消费地征收。一个法国用户购买了你的软件,那么消费地就是法国,所以,你作为软件的销售方,需要在法国缴纳VAT。软件产品适用于标准税率,法国的VAT标准税率是20%。 也就是说,你一个定价$99的软件产品,卖给了法国客户,你需要为法国政府上交$99*20%=$19.8的VAT。你实际到手,只有$79.2。 所以,
4 min read
EIN

在线申请EIN,只要3分钟

我前一段时间曾经写过一篇文章《如何自己动手免费申请EIN》,但文章是针对没有美国ITIN号的同学。对于有ITIN的同学,申请步骤其实简单得多。最近我刚申请到了美国的ITIN号,所以尝试一下在线申请EIN。前后过程只需要3分钟,填写一些企业的基本资料,勾选几个选项。 💡下面的步骤,只合适有ITIN的同学。没有ITIN请看我另外一篇文章 * 打开雇主身份识别号码 (EIN) 在线申请,点击『立即在线申请』 就这么多,剩下就是拿着EIN号去申请水星银行了。使用我的邀请链接https://rr.do/mercury可以获得$250刀
2 min read
SwiftUI

Swift读取RSA Key报错RSA private key creation from data failed

macOS Swift程序因为需要,使用了RSA非对称加密。读取公钥的时候一切正常,但读取私钥的时候会报错 Error Domain=NSOSStatusErrorDomain Code=-50 "RSA private key creation from data failed" (paramErr: error in user parameter list) UserInfo={numberOfErrorsDeep=0, NSDescription=RSA private key creation from data failed} 相关代码片段如下 func loadPrivateKey(from string: String) -> SecKey? { guard let data = Data(base64Encoded:
1 min read
cdn

出海业务如何免费做到全球加速

最近在做ServBay这个macOS下最好的Web开发工具,经常收到赞叹:网站不备案,在国内没有节点,但为什么访问速度飞快,下载速度也有40M+?到底在基础设施上,你花了多少钱? 我经常笑而不语,回答了一句:这都不花钱,也都不是事。 创业者搞初创项目,能白嫖为啥要付费?这也太不尊重Cloudflare和AWS了。 今天我就来讲讲,这是如何做到的。 1、首先,你要有DNSPod 对!做新项目,也不要忘记为过去的项目打广告。DNSPod的IP库是和ipip强强联手联合打造的,分区域的准确性要说第二,谁也不敢认第一。 想加速,首先要做的就是能把用户的来路区分开。国内用户走专门节点,国外用户走另外的节点。 所以我们首先要把网站的域名转到DNSPod。 这里就用servbay.dev来举例。 2、然后,你要有Cloudflare Cloudflare的线路和节点是没得说的,全世界的访问速度基本都能维持在前一。而且还免费(够用了)。 但是,这货在中国不行。虽然他们的客户经理天天来撩我,但说实话,除了移动的网络访问速度很快以外,电信和联通的访问速度都很感人。并且吧,时不时抽
7 min read
telegram

如何安全的转移telegram用户名到另外一个账号

花了30 usdt买的教训,总结下: 🚫telegram中,A账号修改用户名后,B账号并不能马上使用A账号释放出来的用户名,用户名释放的时间是随机的,极有可能会被抢注。这是一门生意 我就是因为这样,用户名被抢注了。最后花了$30赎了回来。 想要安全转移用户名,解决方案如下: 如何安全的把telegram的用户名从A用户转到B用户 * A用户先创建一个频道(channel) * 把A用户的用户名改掉,比如bra改为bra123 * 马上把刚才创建的频道,改为公开(public),然后在link中,输入刚才释放出来的用户名bra * B用户加入刚才新创建的频道 * A用户把频道的所有者(ownership)改为B用户 * B用户把频道从公开(public)改为私有(private)。这时候用户名会被释放 * B用户马上修改自己的用户名为刚才释放出来的用户名bra * OK,完成用户名转换 💡一个小时只能修改2次用户名,多了会触发telegram限频,导致丢用户名💡整个过程15分钟内完成,否则也会导致用户名被释放
1 min read
EIN

如何自己动手免费申请EIN

最近中国的程序员们纷纷出海,很多人也注册了自己的美国LLC公司。但注册完美国公司以后,面临的最大一个问题就是获取EIN(Employer Identification Number)。美国每个企业都需要有属于自己的EIN,不然寸步难行。往近了说,无法开通银行账号(比如水星银行Mercury、Relay、stripe、wise)。往远了说,每年无法报税,会被IRS重罚。所以,申请EIN就成了美国公司新注册后必须进行的第一步操作。 简单来概括,EIN就相当于企业的身份证,或者类似于中国企业的『统一社会信用代码』。但区别在于,中国的企业注册完成后自动获得编号,但美国需要自己申请。 所以,EIN这个东西是完全免费的。不管是申请,还是持有。 但是吧,因为申请EIN的流程有点啰嗦,并且在线申请的话,需要填写个人的SSN。如果通过电话申请,则需要英语很好,而且还要能听懂阿三口音才行。这就难倒了一大票人了。从而滋生出代理申请EIN这么一码事,价格也从几十美刀到几百美刀,甚至某些无良公司敢收小一万块钱RMB的。 今天,不用999,也不用99,9块9都不需要,我们来免费申请EIN。 英语不好?不
4 min read
SwiftUI

@StateObject和@ObservedObject的区别

@ObservedObject创建的对象,会在View重绘的时候重新创建。@StateObject创建的对象不会,只会创建一次,所以在视图重建的时候不会受到影响。 比如 @ObservedObject var downloader = Downloader() // ... @StateObject var downloader = Downloader() VStack { ProgressView(value: downloader.progress.fractionCompleted) .progressViewStyle(LinearProgressViewStyle()) Text("\(Int(downloader.progress.fractionCompleted * 100))%") Button(action: { downloader.cancelDownload() isDownloading = false }) { Text("Cancel") }
1 min read
CPU

MoreFine S500+ AMD ES CPU的诡异问题

在淘宝上买了几台便宜的MoreFine S500+用来在家里跑虚拟化,CPU是AMD Ryzen 9 5900HX ES(100-000000300-30_Y),其中有两台机器很诡异,PVE只要一跑apt upgrade,必定死机重启,屡试不爽。其他时候一点问题都没有。整个过程没有任何log,没有任何core dump,实在是诡异。一开始以为是内存的问题,换过内存后还是一样,重置BIOS也不能解决问题。 偶然的机会,发现dmesg有error,系统不能开启TSC,并且每次重启,报错的CPU核心都不一样 root@pve-2:~# dmesg | grep -i -e tsc -e clocksource [ 0.000000] tsc: Fast TSC calibration using PIT [ 0.000000] tsc: Detected 2894.
3 min read
SDR

Raspbian 64位下安装SDRplay RSP1驱动

Raspbian 64bit其实并不是纯的64位,虽然是aarch64,但还是有很多动态库、可执行文件都是32位的,甚至编译出来的文件默认都是32位 比如 $ file /usr/local/bin/SoapySDRUtil /usr/local/bin/SoapySDRUtil: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=c5236a15f0708fb3213f4ceda6f8bcf2bec88659, for GNU/Linux 3.2.0, not stripped SDRplay的官方提供了64位的API库,但默认安装后会有问题,虽然文件存在,但会提示文件不存在 pi@pi:~ $ ls
1 min read
Network

R86s刷入自制OpenWrt固件

R86s出厂是自己带了eMMC,拿不下来,不好刷。使用官方版本的刷机脚本,刷完以后每次重启系统后,分区都是ro只读,还不如自己手工捣鼓了。 下面提供三种方法刷进去,都是大同小异,先把/dev/mmcblk0的分区表清空,然后dd命令刷入区块。 创建启动用的TF(SD)卡 首先把OpenWrt系统的openwrt-x86-64-generic-squashfs-combined-efi.img镜像(ext4也可以,但意外关机后会产生分区表损坏,需要手工fsck,不然分区也是ro只读,系统不工作)用balenaEtcher写入到TF卡,然后给R86s接入键盘,开机,猛按F7键,选择TF卡启动,进入到OpenWrt界面。 清空原来的分区表 💡这里有个大坑,如果eMMC上本身存在系统,会被OpenWrt默认加载,导致报错进不了TF卡上的OpenWrt。需要在原本的eMMC上的系统去清空分区表,或者借用第三方的安装盘把分区表清空。 接着,开始干掉系统原有分区表 fdisk /dev/mmcblk0 g w 然后,我们就可以刷入系统了。 Opt 1,刷入TF卡上的系统
4 min read
Server

把物理机的Windows Server 2022迁移到PVE

物理机跑了个Windows Server 2022作为AD,现在准备迁移到Proxmox Virtual Environment(PVE),大概记录下步骤 物理机用了UEFI来启动Windows,PVE就不折腾了,直接用了传统的BIOS。所以迁移过程中需要做一些特殊处理。 迁移过程 1、PVE创建一个新的虚拟机(模板选择Default (i440fx)) 2、Windows安装Virtio Win驱动 3、Windows安装VMware Converter或者Disk2vhd,用来创建P2V的镜像。 4、Windows导入注册表mergeide.reg 5、创建物理机镜像。可以用第3步提到的两个工具(用一个就够了,看个人喜好选择,Disk2vhd比较瘦身)。参考截图 6、把创建好的.vhdx或者.vmdk丢到PVE可以访问到的地方。比如NAS、比如PVE本地磁盘。 7、把虚拟盘转换成qcow2格式并导入虚拟机 我们假设PVE创建好的虚拟机的ID是100,那么 cd /path/to/vm/image/100
5 min read
网络

千万别用TP-Link的Mesh

如果自己有核心路由,那就老老实实把TP-Link用来当AP好了。别想着用什么易展,什么Mesh。因为TP-Link会自己劫持一道数据包再转发。如果把TP-Link的无线路由器接到子交换机上,甚至还会出现TP自己充当子交换机的出口,忽略掉子交换机本身的网线出口。 话不多说,直接上图 TP-Link 无线路由器插到子交换机时,会把整个交换机的数据包劫持,特别是流量很大的交换机,延迟很厉害 从子交换机摘掉TP-Link无线路由后,易展主无线路由会劫持整个局域网,造成3.x ms的延迟 整个局域网把易展功能去掉,TP-Link的无线路由只当做纯AP使用 这才像是一个正常的局域网。
1 min read
Server

Intel 82583V 网卡在Windows Server 2022下安装驱动

Intel 82583V,J1900软路由中的『最高端』网卡,Intel都不提供支持了,更别说有什么驱动能更新能用。网上各种求助,也有人拿着修改过的来卖钱。 其实不用这么麻烦,进入『设备管理器』,在识别不出来的网卡上点击右键,选『更新驱动程序』 选『浏览我的电脑以查找驱动程序』 选择『让我计算机上的可用驱动程序列表中选取』 选『网络适配器』 左侧厂商选择『Intel Corporation』,右侧型号选择『Intel(R) 82580 Gigabit Network Connection』 弹出的警告里面选『是』 安装完毕,愉快的玩耍吧 连接使用一切正常
2 min read
Active Directory

Outline整合KeyCloak的OIDC登录

前面几篇文章讲到了《Docker Compose安装Keycloak》、《Keycloak使用群晖Synology Directory Server作为AD/LDAP用户数据源》,我们已经实现了KeyCloak的安装和与群晖NAS的整合,那么接下来我们需要用这个AD的用户数据源为一系列服务提供账号登陆支持。Gitlab已经讲过了,那么接下来可以试一下Outline。 Outline是一个比较新的,类似Notion的在线记事本,我前面也讲了如何快速部署Outline。但之前是用了Azure Active Directory,在手机的EDGE浏览器登录的时候,非要拉起微软自己的APP,华为手机还不支持。所以我们现在要干掉Azure Active Directory,改为自己的群晖AD用户。 1、KeyCloak中创建新的Realm 首先,我建议是单独创建一个realm,不要使用KeyCloak默认的master,好处是可以做到用户数据和应用的隔离,保证KeyCloak的安全性。 登录KeyCloak的后台,左上角有个下拉,默认是master,点击下拉菜单,然后点击『Create
4 min read
技术

Keycloak使用群晖Synology Directory Server作为AD/LDAP用户数据源

这又是keycloak的另外一个大坑。keycloak并不会自动创建一系列SSL证书相关的配置,都要自己手撸。 如果还没安装keycloak,可以参考前一篇文章『Docker Compose安装Keycloak』 然后,你的群晖要先把AD配置好,这里就不重复了。 1、获得群晖AD对应的SSL证书 首先,要把群晖为AD所生产的自签名SSL证书下载回来,后面需要用。 位置:群晖DSM管理后台-控制面板-安全性-证书。如果不太确定是哪张证书,可以点击『设置』,找到『Synology Directory Server』对应的证书下拉。 在对应的证书上点击右键,选择『导出证书』 导出的证书解压后有两个文件,一个是证书本身cert.pem,另外一个是证书的私钥privkey.pem,我们需要用到的是cert.pem 💡UPDATE 另外一个使用OpenSSL来获取证书的方法(方便不支持导出的LDAP服务器) openssl s_client -showcerts -verify 5 -connect <AD/LDAP服务器IP或者域名>:636
6 min read
技术

Docker Compose安装Keycloak

Keycloak的安装其实挺烦人的,相关文章并不多,参考也不多,很多例子都是旧版本的,随手记录下安装和配置信息吧。 使用的数据库是postgresql,假设已经有安装好的postgresql,并且默认管理员账号是postgres,那么我们先创建keycloak的用户 su - postgres # 我们创建一个名为keycloak的pgsql用户,和名为keycloak的数据库 createuser -s -P keycloak createdb keycloak -O keycloak 然后我们创建一个文件,docker-compose.yml version: "3" services: keycloak: image: quay.io/keycloak/keycloak:20.0 container_name: keycloak environment: KC_HOSTNAME: <域名,如sso.naizhao.com>
3 min read
Synology

Gitlab整合群晖Synology Active Directory

群晖自己的文章并没有相关的帮助文档,网上也搜不到,这里留下来做个备份吧。 1、群晖先创建AD域 这里假定你设置的域名是wu.work,NetBIOS是wu,域管理员账号是ad-admin。大概类似截图中的样子 域管理员账号是你创建AD时输入的,不是NAS的管理员账号,别搞错了! 2、编辑gitlab.rb 如果你是用docker-compose安装的,应该会在docker-compose.yml里面指定了config目录的volume,在config目录里面就可以找到gitlab.rb。如果你是其他方式安装,文件在/etc/gitlab。如果还是找不着,自己Google。 打开gitlab.rb文件,找到ldap部分,然后把下面的内容贴进去(自己根据情况修改) 注意空格和缩进,注意空格和缩进,注意空格和缩进!!! # LDAP gitlab_rails['ldap_enabled'] = true gitlab_rails['prevent_ldap_sign_in&
3 min read