分类 工作&技术 下的文章

以前用油猴插件,它是每天第一次上去时自动签,略嫌麻烦,毕竟不是每天上去,影响升仙进度,虽然已经有神仙号了。
自己写了段代码来搞定,然后扔cron表里即可。没什么技术含量的东西,只是存着备忘,有需要的也请自取自己编译了。

main.go
httputil.go

然后建立 account.yaml

account:
  username: "用户名"
  password: "密码"

没必要,但是,生命在于折腾。
blog是用的typecho,标准的lnmp了,基本上别的lnmp网站都是这样的。

docker-compose.yml:

version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"    暴露http/https出去
      - "443:443"
    volumes:
      - ./nginx:/etc/nginx/    apt和docker一致,/etc/nginx
      - ./www:/var/www         
      - ./letsencrypt:/etc/letsencrypt/    
    networks:
      - blog
    restart: always

  php:
    image: php:8.2-fpm
    command: bash -c "docker-php-ext-install pdo_mysql && php-fpm"    原始的docker没mysqli
    volumes:
      - ./fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf     apt的是/etc/php/8.2/fpm/xxxxx 这样的
      - ./www:/var/www
    networks:
      - blog
    restart: always

  mariadb:     mysql不好玩,用mariadb
    ports:
      - "127.0.0.1:3306:3306"    方便在宿主机上操作数据库,只宿主机可访问,不对外
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./mariadb:/var/lib/mysql
    networks:
      - blog
    restart: always
networks:
  blog:
    driver: bridge

然后修改一下typecho中的config.php的数据库连接就好。一个小麻烦是先前数据库是unix socks访问,需要改成tcp,还需要root可以远程访问,因为php和mysql算是远程了。

xfce xrdp fcitx5,三个搭配起来还不错,再装上chrome,以及termius和vscode,感觉我的日常工作都可以在上面做了。
实测在netcup的rs1000(4c8g,vds)上可以非常流畅的跑,阿里199(2c4g)上有点小卡,而且内存紧张。其实Windows做得并不差,linux看起来流畅和省资源,只是因为没跑桌面。真要跑桌面,用起资源来,不比windows省油多少,甚至更费。
安装命令下面备忘一下,主要是fcitx5麻烦点,按照很多网上的文档装好后,在chrome等应用中是无法输入中文的。

apt install task-xfce-desktop
apt install xorgxrdp xrdp 
adduser xrdp ssl-cert
dpkg-reconfigure locales   选择en-us utf8和zh-ch utf8
adduser xxxx  建立自己的桌面用户,root不能直接运行chrome
apt-get install fonts-arphic-bsmi00lp fonts-arphic-gbsn00lp fonts-arphic-gkai00mp 
apt-get install fcitx5*
apt-get install fcitx5-frontend-qt5 fcitx5-frontend-gtk2 fcitx5-frontend-gtk3 fcitx5-pinyin fcitx5-chinese-addons fcitx5-chewing fcitx5-module-lua fcitx5-module-lua-common fcitx5-modules unicode-cldr-core
echo -e 'XIM=fcitx5\nXIM_PROGRAM=fcitx5\nGTK_IM_MODULE=fcitx5\nQT_IM_MODULE=fcitx5\nXMODIFIERS=@im=fcitx5\nSDL_IM_MODULE=fcitx5\nGLFW_IM_MODULE=fcitx5' > /etc/environment
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt install ./google-chrome-stable_current_amd64.deb

  • 解决了crash的问题。前一版的问题是在于用户隐私设置,如果禁止转发消息,则不会在forward信息中带有原始用户的user id,引起异常。 解决办法,就是在收到用户消息后,服务器保存消息id和chatid(user id),然后在回复转发消息时查表即可。(回复时带有reply id,即前面的消息id)。
  • 加入了webhook和pooling两种机制的支持,通过yaml配置即可。
  • yaml示例:

    account:
    mode: "pooling"  或者是 webhook
    token: "aaaaa"   @botfather建立bot时得到的token
    owner: 12345678   需要转发的目地user id
    endpoint: "https://www.foo.bar"   webook的接收消息地址。pooling时随便填。完整的endpoint是 https://www.foo.bar/{token}。 telegram的要求必须是https协议。
    port: 80              服务监听端口,pooling时随便填。代码使用的http,因为前端会用cloudflare等反代,没必要弄https,还要折腾证书,烦一个字。

bot.go
telegram.go

继续接着 上次的事 来弄
完美的做法当然是仔细的通过事务和数据锁等等来解决这个,但,大家都很忙,能有简单但有效的解决办法么?
当然。

  1. 路由处理函数随机延时,比如每次请求 sleep 0-100ms。人类感觉不大出来这个时间,人的神经线传输是0.3秒。但它就可以有效的把并发处理从时间上分散开。当然,我是指不是恶意的,只是因为不小心或者实在太凑巧了并发了。
  2. 路由函数加互斥锁,锁使用用户token或者userid等。其实绝大多数路由函数,特别是写的操作,简单的互斥锁就够了,咱们遇不到真正需要严格并发处理它的这种业务需求。
  3. 忽略掉逻辑上不可能的并发,比如,同一个用户一秒登录10次,那就只处理第一个请求,后面9个通通直接return。这一方面是解决并发,一方面也是防止cc。