为什么要用docker装node
node经常有多版本需求,某些特殊项目还容易遇到各种坑。尤其是文件夹繁多问题,对于我来说感觉很烦躁。我认为放在docker里能解决所有问题,这对后来接手的人也友好。
构建脚本
- 创建一个目录,放入
start.sh和Dockerfile
start.sh 为:
#!/bin/sh
if [ -d "$1" ]; then
cd "$1"
fi
shift
command="$@"
eval $command
node经常有多版本需求,某些特殊项目还容易遇到各种坑。尤其是文件夹繁多问题,对于我来说感觉很烦躁。我认为放在docker里能解决所有问题,这对后来接手的人也友好。
start.sh 和 Dockerfilestart.sh 为:
#!/bin/sh
if [ -d "$1" ]; then
cd "$1"
fi
shift
command="$@"
eval $command

去看了《里斯本丸沉没》,这是一部记录片电影,关于二战中国渔民拯救被美国击沉的日本英军战俘船的事。
1941年底日军偷袭珍珠港,英美对日宣战,日军圣诞节攻陷英军驻守的香港。1942.9月,日本用货船里斯本丸号押送1800多名英军战俘回本国。没有悬挂战俘船旗帜,被美军潜艇于浙江舟山附近击中,日本叫来军舰拯救日本士兵,用帆布和木板封住了船舱,士兵饥饿,疾病,拥挤在黑暗中,一点点看着水越来越多。冲破封锁,被日军扫射。舟山青浜岛和庙子湖岛的两百多渔民发现后冒险去救,日军看事情掩盖不住,也开始救援。结果中国渔民救起384人,日军救起七百多人,有800多人葬身大海。随后,日军上岛重新搜查战俘,带回日本。只有三名级别高一点的英军被藏了起来,辗转送到重庆。 战后幸存者700余人。
亚伯拉罕诸教包含犹太教基督教伊斯兰教。各教典籍中前边部分差不多(圣经旧约部分),信仰唯一真神耶和华(安拉),共同先知亚当、诺亚、亚伯拉罕、摩西等多位。 先有犹太教。 后来有基督教,信耶稣是基督(弥赛亚)降临,是神的儿子(后来有三位一体说,耶稣是神的化身)。 再有伊斯兰教,信穆罕默德为最后一位先知(众先知的封印),认同耶稣是弥赛亚,但不认同他是神的儿子。 三教在教义仪式规定上区别很大,所以并不相容。
犹太人两千多年分布于世界,没有自己的国家,依靠犹太教仍然保持一种连接,始终相信弥赛亚会降临(不认同耶稣是弥赛亚),带领他们回到应许之地(Promised Land)也就是现在的以色列巴勒斯坦这片地方。随着二战后锡安主义(犹太复国主义)兴起,犹太人在前几十年的种种被迫害(不止二战德国,整个欧洲都是反犹的),全世界的犹太人利用影响力从巴勒斯坦托管地区建立了以色列(犹太人解释这不是弥赛亚降临,是一种过渡,迷惑)。而巴勒斯坦这片中东国家都是阿拉伯人信伊斯兰教的,所以爆发多次中东战争。(最近美国要通过一个《反犹太意识法案》,被网友称作王祖贤法案,源于东成西就“想也不行,想也有罪”。)
nginx因为需要安装替换字符串的扩展,所以要自己编译。
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_modulenginx -V 注意内部版本号--add-module=/目录/ngx_http_substitutions_filter_module --with-pcre=/目录/pcre-8.45。 类似于 ./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=/root/google/ngx_http_substitutions_filter_module --with-pcre=/root/google/pcre-8.45make 如果最后出现报错,缺少什么工具,安装即可。 有的名字对不上,搜索一下。cd objs 可以看到编译后的nginx。 复制到/usr/sbin下,重启nginx即可。
二战苏联和德国在勒热夫的伤亡达到180万。尤其是苏联,最不缺的就是人,所以一直是用人命在填充。于是这个城市也被称为“勒热夫绞肉机”。
二战胜利后苏联授予很多英雄城市,没有勒热夫。
2020年,俄罗斯在勒热夫塑造了这个雕像。士兵的下半身逐渐破碎为鹤群,我很喜欢。
本文基于 MySQL8.0,InnoDB引擎,如有错误欢迎指正。
数字
unsignedint自增,一般选bigint没啥必要tinyint可以用来存储 布尔、枚举、年龄等,枚举时尽量不占用0值,布尔用0和1表示。int扩大100倍的方式,或者用decimal(本质是字符串)字符串
char。text。varchar。虽然磁盘占用按实际大小,但是字段应设置尽量小的长度限制。不需要16、64这种'整数',完全可以10、20。时间
datetime,不建议timestamp和int,原因见下文。NOT NULL DEFAULT CURRENT_TIMESTAMP,更新时间NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,自动维护。感觉ChatGPT很好玩,尝试逆向调用放到公众号上。
一方面OpenAI还未开放这个接口,最近几天它们也在不断增加安全策略;另一方面,结果响应速度太慢,大多数都会超出公众号被动回复的时间限制。
退而求其次,在OpenAI官网找到了之前版本的公开接口,代码发布在 https://github.com/tomatocuke/openai。
代码为内部技术群大佬写的
package main
import (
"runtime"
"unsafe"
)
type markBits struct {
bytep *uint8
mask uint8
index uintptr
}
//go:linkname isMarked runtime.markBits.isMarked
func isMarked(m markBits) bool
//go:linkname spanOf runtime.spanOf
func spanOf(p uintptr) unsafe.Pointer
//go:linkname objIndex runtime.(*mspan).objIndex
func objIndex(s unsafe.Pointer, p uintptr) uintptr
//go:linkname allocBitsForIndex runtime.(*mspan).allocBitsForIndex
func allocBitsForIndex(s unsafe.Pointer, allocBitIndex uintptr) markBits
func allocBitsForAddr(p uintptr) markBits {
s := spanOf(p)
objIndex := objIndex(s, p)
return allocBitsForIndex(s, objIndex)
}
var ca [10]chan int
var pa [10]uintptr
func main() {
for i := 0; i < len(pa); i++ {
c := make(chan int, 10)
p := *(*uintptr)(unsafe.Pointer(&c))
c <- 1
c <- 2
c <- 3
ca[i] = c
pa[i] = p
}
for i := 0; i < len(pa); i++ {
if i%2 == 0 {
continue
}
ca[i] = nil
}
runtime.GC()
for i := 0; i < len(pa); i++ {
println(isMarked(allocBitsForAddr(pa[i])))
}
}