解决办法:
下载VCRUNTIME140.dll文件;微软官网:下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=52685
下载真实地址及名称:vc_redist.x64.exe
https://download.microsoft.com/download/0/6/4/064F84EA-D1DB-4EAA-9A5C-CC2F0FF6A638/vc_redist.x64.exe
下载VCRUNTIME140.dll文件;微软官网:下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=52685
下载真实地址及名称:vc_redist.x64.exe
https://download.microsoft.com/download/0/6/4/064F84EA-D1DB-4EAA-9A5C-CC2F0FF6A638/vc_redist.x64.exe
[实践OK]C语言函数指针再学习。
Unix/LinuxC技术 jackxiang 2021-5-10 09:49
此次学习来源:https://mp.weixin.qq.com/s/YqZI4XUlsyPpaGIjy0pG3A
#cat p.c
#./p
value= 520
cat pp.c
#./pp
cat ppp.c
#./ppp
value0 = 1
value1 = 2
value2 = 3
temp[0] = 1
temp[1] = 2
temp[2] = 3
以前的学习:
https://jackxiang.com/post/7485/
#cat p.c
#./p
value= 520
cat pp.c
#./pp
cat ppp.c
#./ppp
value0 = 1
value1 = 2
value2 = 3
temp[0] = 1
temp[1] = 2
temp[2] = 3
以前的学习:
https://jackxiang.com/post/7485/
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
真实下载地址:https://download.oracle.com/otn/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-macosx-x64.dmg
源码包下载地址:https://download.oracle.com/otn-pub/java/jdk/16.0.1+9/7147401fd7354114ac51ef3e1328291f/jdk-16.0.1_osx-x64_bin.tar.gz?AuthParam=1620358646_aa79aa4a7788c49057533e4b661b7f35
下载前的用户名密码:
https://jackxiang.com/post/6461/
来自:https://zhuanlan.zhihu.com/p/34915988
start.sh
真实下载地址:https://download.oracle.com/otn/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-macosx-x64.dmg
源码包下载地址:https://download.oracle.com/otn-pub/java/jdk/16.0.1+9/7147401fd7354114ac51ef3e1328291f/jdk-16.0.1_osx-x64_bin.tar.gz?AuthParam=1620358646_aa79aa4a7788c49057533e4b661b7f35
下载前的用户名密码:
https://jackxiang.com/post/6461/
来自:https://zhuanlan.zhihu.com/p/34915988
start.sh
[实践OK]Centos8环境中配置PHP出现configure: error: Package requirements (oniguruma) were not met
Php/Js/Shell/Go jackxiang 2021-3-3 23:45
在Centos8环境中配置PHP出现如上报错:
原因是没有安装配置oniguruma导致的
解决方法如下:
1、获取源码,2.并解压
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar -zxf oniguruma-6.9.4.tar.gz
cd oniguruma-6.9.4
备用下载: http://down.24kplus.com/linux/oniguruma/oniguruma-6.9.4.tar.gz
3、编译安装
./autogen.sh && ./configure --prefix=/usr
make && make install
如果是Centos7环境中的话:
解决方法如下:
yum -y install http://mirror.centos.org/centos-7/7.7.1908/cloud/x86_64/openstack-queens/oniguruma-6.7.0-1.el7.x86_64.rpm
yum -y install http://mirror.centos.org/centos-7/7.7.1908/cloud/x86_64/openstack-queens/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
备用下载:
oniguruma:http://down.24kplus.com/linux/oniguruma/oniguruma-6.7.0-1.el7.x86_64.rpm
oniguruma-devel:http://down.24kplus.com/linux/oniguruma/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
————————————————
版权声明:本文为CSDN博主「薄凉小伙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kangshuo2471781030/article/details/107241779
原因是没有安装配置oniguruma导致的
解决方法如下:
1、获取源码,2.并解压
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar -zxf oniguruma-6.9.4.tar.gz
cd oniguruma-6.9.4
备用下载: http://down.24kplus.com/linux/oniguruma/oniguruma-6.9.4.tar.gz
3、编译安装
./autogen.sh && ./configure --prefix=/usr
make && make install
如果是Centos7环境中的话:
解决方法如下:
yum -y install http://mirror.centos.org/centos-7/7.7.1908/cloud/x86_64/openstack-queens/oniguruma-6.7.0-1.el7.x86_64.rpm
yum -y install http://mirror.centos.org/centos-7/7.7.1908/cloud/x86_64/openstack-queens/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
备用下载:
oniguruma:http://down.24kplus.com/linux/oniguruma/oniguruma-6.7.0-1.el7.x86_64.rpm
oniguruma-devel:http://down.24kplus.com/linux/oniguruma/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
————————————————
版权声明:本文为CSDN博主「薄凉小伙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kangshuo2471781030/article/details/107241779
[实践OK]python获取传入argv参数列表,以及字符为空判断,python退出之退出os._exit(-1)。
Php/Js/Shell/Go jackxiang 2021-2-23 17:43
python excelsearchKeyList.py k.txt
sys.argv[0] = excelsearchKeyList.py
sys.argv[1] = k.txt
二)判断字符为空:
python excelsearchKeyList.py k.txt
原创视频
line is null
line is null
三)判断是否传入新的参数:
来自:https://blog.csdn.net/index20001/article/details/74294945#:~:text=Python%E7%A8%8B%E5%BA%8F%E6%9C%89%E4%B8%A4%E7%A7%8D,%E8%A7%A3%E9%87%8A%E5%99%A8%E5%B0%86%E4%BC%9A%E9%80%80%E5%87%BA%E3%80%82
[实践OK]CentOS8下ssh登陆出现[error] character map file `UTF-8' not found: No such file or directory
Unix/LinuxC技术 jackxiang 2021-2-3 17:55
问题:
rpm -qa *langpack*
cat /etc/locale.conf
LC_ALL="zh_CN.utf8"
LC_CTYPE="zh_CN.utf8"
LANG="zh_CN.utf8"
解决办法:
yum install glibc-langpack-zh -y
rpm -qa *langpack*
cat /etc/locale.conf
LC_ALL="zh_CN.utf8"
LC_CTYPE="zh_CN.utf8"
LANG="zh_CN.utf8"
解决办法:
yum install glibc-langpack-zh -y
一、现象
Linux关机或重启时提示A stop job is running for ..
导致关机慢。
二、解决方法
编辑/etc/systemd/system.conf
修改下面两个变量为:
DefaultTimeoutStartSec=10s
DefaultTimeoutStopSec=10s
执行:systemctl daemon-reload
来自:https://blog.csdn.net/penge199761/article/details/79136826
Linux关机或重启时提示A stop job is running for ..
导致关机慢。
二、解决方法
编辑/etc/systemd/system.conf
修改下面两个变量为:
DefaultTimeoutStartSec=10s
DefaultTimeoutStopSec=10s
执行:systemctl daemon-reload
来自:https://blog.csdn.net/penge199761/article/details/79136826
[实践OK]用c语言的语法逻辑进行判断是不是质数的重构逻辑学习。
Unix/LinuxC技术 jackxiang 2021-1-14 10:53
质数定义:只有1和它本身两个约数,除此之外再没有其它约数。
示例1:
make zs
cc zs.c -o zs
#./zs
质数
示例2:
for循环介入:
引入scanf:
#./zs
5
质数
#./zs
6
合数
打印出约数:
#./zs
5
质数
#./zs
6
2 3 合数
更快一点,引入break:
#./zs
6
合数
#./zs
1000
合数
任一大于2的偶数都可以写成两个质数之和,采用部分穷举法,可以从1-100,1-10000啥的,但无法穷举所有:
#./zs
100
4=2+2
6=3+3
8=3+5
10=3+7
12=5+7
14=3+11
16=3+13
18=5+13
20=3+17
22=3+19
24=5+19
26=3+23
28=5+23
30=7+23
32=3+29
34=3+31
36=5+31
...
示例1:
make zs
cc zs.c -o zs
#./zs
质数
示例2:
for循环介入:
引入scanf:
#./zs
5
质数
#./zs
6
合数
打印出约数:
#./zs
5
质数
#./zs
6
2 3 合数
更快一点,引入break:
#./zs
6
合数
#./zs
1000
合数
任一大于2的偶数都可以写成两个质数之和,采用部分穷举法,可以从1-100,1-10000啥的,但无法穷举所有:
#./zs
100
4=2+2
6=3+3
8=3+5
10=3+7
12=5+7
14=3+11
16=3+13
18=5+13
20=3+17
22=3+19
24=5+19
26=3+23
28=5+23
30=7+23
32=3+29
34=3+31
36=5+31
...
[实践OK]关于go进行多进程通讯的等待子进程问题学习浅显研究。
Php/Js/Shell/Go jackxiang 2021-1-4 18:53
背景:有一篇朋友圈说是一个k8s里面Server的Pod销毁上报Zookeeper出现IP地址连接还是原来的,用到了zk的watcher,理论上不应该这样,于是查来查去,其大体意思就是说用了Go的多进程,有一个进程去读取配置了,因为配置还是老的,而用到了Go的多进程,于是文末那代码,我看了下,简单,但不明白,于是顺藤摸瓜学习一下这个rsync的原理。
——————————
#tree -L 2 .|grep go
├── loop.go
├── pipe.go
├── waitgrouppointer.go
└── wg.go
#cat loop.go
package main
import (
"fmt"
//"time"
)
func main(){
for i := 0; i < 100 ; i++{
go fmt.Println(i)
}
//time.Sleep(time.Second)
}
这个说是运行太快,子进程没输出主进程就退了,啥也不输出。
#cat pipe.go
package main
import (
"fmt"
//"time"
)
func main() {
c := make(chan bool, 100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
c <- true
}(i)
}
for i := 0; i < 100; i++ {
<-c
}
}
这个说是管道要是上万,会耗尽系统管道资源。
#cat waitgroup.go
package main
import (
"fmt"
"sync"
//"time"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
这个说是挺好的,因为它用到了原子加减法,这里好像C语言也有类似的函数,
再就是说它是用来阻塞方进程的,WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。
这里首先把wg 计数设置为100, 每个for循环运行完毕都把计数器减一,主函数中使用Wait() 一直阻塞,直到wg为零——也就是所有的100个for循环都运行完毕。相对于使用管道来说,WaitGroup 轻巧了许多。
最后,如果要搞裂成函数,得用引用传入,指针变量:
WaitGroup对象不是一个引用类型
WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址:
#cat waitgrouppointer.go
package main
import (
"fmt"
"sync"
//"time"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go f(i, &wg)
}
wg.Wait()
}
// 一定要通过指针传值,不然进程会进入死锁状态
func f(i int, wg *sync.WaitGroup) {
fmt.Println(i)
wg.Done()
}
以上来自:https://blog.csdn.net/u013474436/article/details/88749749
溯源来自:https://mp.weixin.qq.com/s/s9G6yDqfeFepbKT6DJASng
#cat wg.go
package main
import (
"fmt"
"sync"
)
func main() {
ok := true
for i := 0; i <1000; i ++ {
var arr []int
wg := sync.WaitGroup{}
for j := 0; j <2; j ++ {
wg.Add(1)
go func() {
defer wg.Done()
arr = append(arr, i)
}()
}
wg.Wait()
if len(arr) < 2 {
fmt.Printf("error:%d \n", i)
ok = false
break
}
}
if ok {
fmt.Println("ok")
}
}
阅读全文
——————————
#tree -L 2 .|grep go
├── loop.go
├── pipe.go
├── waitgrouppointer.go
└── wg.go
#cat loop.go
package main
import (
"fmt"
//"time"
)
func main(){
for i := 0; i < 100 ; i++{
go fmt.Println(i)
}
//time.Sleep(time.Second)
}
这个说是运行太快,子进程没输出主进程就退了,啥也不输出。
#cat pipe.go
package main
import (
"fmt"
//"time"
)
func main() {
c := make(chan bool, 100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
c <- true
}(i)
}
for i := 0; i < 100; i++ {
<-c
}
}
这个说是管道要是上万,会耗尽系统管道资源。
#cat waitgroup.go
package main
import (
"fmt"
"sync"
//"time"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
这个说是挺好的,因为它用到了原子加减法,这里好像C语言也有类似的函数,
再就是说它是用来阻塞方进程的,WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。
这里首先把wg 计数设置为100, 每个for循环运行完毕都把计数器减一,主函数中使用Wait() 一直阻塞,直到wg为零——也就是所有的100个for循环都运行完毕。相对于使用管道来说,WaitGroup 轻巧了许多。
最后,如果要搞裂成函数,得用引用传入,指针变量:
WaitGroup对象不是一个引用类型
WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址:
#cat waitgrouppointer.go
package main
import (
"fmt"
"sync"
//"time"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go f(i, &wg)
}
wg.Wait()
}
// 一定要通过指针传值,不然进程会进入死锁状态
func f(i int, wg *sync.WaitGroup) {
fmt.Println(i)
wg.Done()
}
以上来自:https://blog.csdn.net/u013474436/article/details/88749749
溯源来自:https://mp.weixin.qq.com/s/s9G6yDqfeFepbKT6DJASng
#cat wg.go
package main
import (
"fmt"
"sync"
)
func main() {
ok := true
for i := 0; i <1000; i ++ {
var arr []int
wg := sync.WaitGroup{}
for j := 0; j <2; j ++ {
wg.Add(1)
go func() {
defer wg.Done()
arr = append(arr, i)
}()
}
wg.Wait()
if len(arr) < 2 {
fmt.Printf("error:%d \n", i)
ok = false
break
}
}
if ok {
fmt.Println("ok")
}
}
阅读全文
[实践成功]go tcp tcpclient编码
Php/Js/Shell/Go jackxiang 2020-12-30 16:55
Server:echoServer.go
Client:echoClient.go
jackXiang@localhost ~/golearning ./echoClient
jack
read from socket:
jack
xiang
read from socket:
xiang
Q:果然Ok,两个问题探讨下:
1) ip4 := net.ParseIP(ADDR).To4()
sa := &syscall.SockaddrInet4{Port: PORT}
copy(sa.Addr[:], ip4) #这个sa.Addr[:] 冒号啥写法呢?
2)for { 这里面是epoll 吗?}
A:
1.
copy(sa.Addr[:], ip4) #这个sa.Addr[:] 冒号啥写法呢?
sa.Addr 是一个数组,
sa.Addr[:] 将这个数组临时转为切片,底层数组指向sa.Addr数组
方便copy进行切片复制
2. 就是个for{}死循环,防止代码往下执行
来自:
https://mp.weixin.qq.com/s/dRADQ5kUCT80dX7oEAAXyA
https://mp.weixin.qq.com/s/kFHw73w_IIqjKeicesCpZw
Client:echoClient.go
jackXiang@localhost ~/golearning ./echoClient
jack
read from socket:
jack
xiang
read from socket:
xiang
Q:果然Ok,两个问题探讨下:
1) ip4 := net.ParseIP(ADDR).To4()
sa := &syscall.SockaddrInet4{Port: PORT}
copy(sa.Addr[:], ip4) #这个sa.Addr[:] 冒号啥写法呢?
2)for { 这里面是epoll 吗?}
A:
1.
copy(sa.Addr[:], ip4) #这个sa.Addr[:] 冒号啥写法呢?
sa.Addr 是一个数组,
sa.Addr[:] 将这个数组临时转为切片,底层数组指向sa.Addr数组
方便copy进行切片复制
2. 就是个for{}死循环,防止代码往下执行
来自:
https://mp.weixin.qq.com/s/dRADQ5kUCT80dX7oEAAXyA
https://mp.weixin.qq.com/s/kFHw73w_IIqjKeicesCpZw
[要实践么]macOS Big Sur 可写模式挂载root
Unix/LinuxC技术 jackxiang 2020-11-26 10:27
背景:[实践OK]Macbook 升级到catalina 后的一些/data目录不见了等问题
:https://jackxiang.com/post/10397/,现在升级后,这个玩法被苹果给屏蔽更深了,怎么办?有人做这个,我不太敢接着搞下去了:
Big Sur 新增了 Signed System Volume 机制,对系统所在的 APFS Volume 增加了更多的保护
Reboot into recovery mode and run:重启mac,按住Command+R,等到系统进入安全模式。
命令 csrutil disable ,sur还得加上这个:
csrutil authenticated-root disable
Reboot back into MacOS #正常重启进入系统
Find your root mount's device - run mount and chop off the last s, e.g. if your root is /dev/disk1s5s1, you'll mount /dev/disk1s5
Create a new directory, for example ~/mount
Run:sudo mount -o nobrowse -t apfs /dev/disk1s5 ~/mount ,我这想:sudo mount -o nobrowse -t apfs /dev/disk1s5 /var/data
/dev/disk1s5s1 :https://iosre.com/t/big-sur/18051
升级到Big Sur后,以写模式挂载root报错(SIP已disable)
sudo mount -uw /
mount_apfs: volume could not be mounted: Permission denied
mount: / failed with 66
Big Sur 新增了 Signed System Volume 机制,对系统所在的 APFS Volume 增加了更多的保护
Reboot into recovery mode and run:
csrutil authenticated-root disable
Reboot back into MacOS
Find your root mount's device - run mount and chop off the last s, e.g. if your root is /dev/disk1s5s1, you'll mount /dev/disk1s5
Create a new directory, for example ~/mount
Run:sudo mount -o nobrowse -t apfs /dev/disk1s5 ~/mount
Modify the files under the mounted directory
Run:sudo bless --folder MOUNT_PATH/System/Library/CoreServices --bootefi --create-snapshot
Reboot your system, and the changes will take place
缺点:
修改后,无法再启用SSV机制,但是可以启用SIP机制,因为系统已修改,导致签名不一致,若启用SSV,则校验失败,报错禁止启动。
csrutil enable
csrutil authenticated-root disable
Big Sur 引入的 Signed System Volume 机制会给 System APFS Volume 的每个文件 /文件夹都设置一份 hash,在 bootloader 启动后,加载内核前会进行完整性校验,校验不通过的话会拒绝引导,并提示用户重装 macOS 。使用 mount 查看挂载点会发现 /多了个 sealed 标志。系统默认会从 SSV snapshot 启动,对用户无感知。
Big Sur’s Signed System Volume: added security protection
来自:https://www.quwenqing.com/archives/1597.html
:https://jackxiang.com/post/10397/,现在升级后,这个玩法被苹果给屏蔽更深了,怎么办?有人做这个,我不太敢接着搞下去了:
Big Sur 新增了 Signed System Volume 机制,对系统所在的 APFS Volume 增加了更多的保护
Reboot into recovery mode and run:重启mac,按住Command+R,等到系统进入安全模式。
命令 csrutil disable ,sur还得加上这个:
csrutil authenticated-root disable
Reboot back into MacOS #正常重启进入系统
Find your root mount's device - run mount and chop off the last s, e.g. if your root is /dev/disk1s5s1, you'll mount /dev/disk1s5
Create a new directory, for example ~/mount
Run:sudo mount -o nobrowse -t apfs /dev/disk1s5 ~/mount ,我这想:sudo mount -o nobrowse -t apfs /dev/disk1s5 /var/data
/dev/disk1s5s1 :https://iosre.com/t/big-sur/18051
升级到Big Sur后,以写模式挂载root报错(SIP已disable)
sudo mount -uw /
mount_apfs: volume could not be mounted: Permission denied
mount: / failed with 66
Big Sur 新增了 Signed System Volume 机制,对系统所在的 APFS Volume 增加了更多的保护
Reboot into recovery mode and run:
csrutil authenticated-root disable
Reboot back into MacOS
Find your root mount's device - run mount and chop off the last s, e.g. if your root is /dev/disk1s5s1, you'll mount /dev/disk1s5
Create a new directory, for example ~/mount
Run:sudo mount -o nobrowse -t apfs /dev/disk1s5 ~/mount
Modify the files under the mounted directory
Run:sudo bless --folder MOUNT_PATH/System/Library/CoreServices --bootefi --create-snapshot
Reboot your system, and the changes will take place
缺点:
修改后,无法再启用SSV机制,但是可以启用SIP机制,因为系统已修改,导致签名不一致,若启用SSV,则校验失败,报错禁止启动。
csrutil enable
csrutil authenticated-root disable
Big Sur 引入的 Signed System Volume 机制会给 System APFS Volume 的每个文件 /文件夹都设置一份 hash,在 bootloader 启动后,加载内核前会进行完整性校验,校验不通过的话会拒绝引导,并提示用户重装 macOS 。使用 mount 查看挂载点会发现 /多了个 sealed 标志。系统默认会从 SSV snapshot 启动,对用户无感知。
Big Sur’s Signed System Volume: added security protection
来自:https://www.quwenqing.com/archives/1597.html
背景:Chrome您的连接不是私密连接解决办法--一个比较实用的技巧分享,有的勾选确认,发现没有勾选按钮。怎么办?
方法:解决:就是在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页。
阅读全文
方法:解决:就是在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页。
阅读全文
Mac / OS X 如何快速显示桌面:F4
Mac苹果电脑怎么设置Launchpad快捷键?F11
=============================
Mac / OS X 如何快速显示桌面(Desktop)?
https://www.zhihu.com/question/21448506
【收藏】Mac苹果电脑怎么设置Launchpad快捷键?
来自:https://www.zhihu.com/question/21448506
Mac苹果电脑怎么设置Launchpad快捷键?F11
=============================
Mac / OS X 如何快速显示桌面(Desktop)?
https://www.zhihu.com/question/21448506
【收藏】Mac苹果电脑怎么设置Launchpad快捷键?
来自:https://www.zhihu.com/question/21448506
[实践OK]协程 shell_exec 如何捕获标准错误流
Swoole专题研究 jackxiang 2020-11-3 14:30
问题:用Co\System::exec()执行了一个不存在的命令时,错误信息会直接打印到屏幕,而不是返回错误信息。
怎么办:实际上Swoole提供的System::exec()行为上与PHP的shell_exec是完全一致的,我们写一个shell_exec的同步阻塞版本,执行后发现同样拿不到标准错误流输出的内容,会被直接打印到屏幕。
答案: 使用proc_open+hook实现。
现象:
==================================================================
#php tt.php
PHP Warning: shell_exec() has been disabled for security reasons in /data/www/testswoole/tt.php on line 2
NULL
估计整成错误输出了,于是用:
php tt.php >/dev/null 2>&1
果然,怎么办?加入管道,将此错误指向新的文件描述符。
前置:打开php.ini里面的proc_open禁用函数。
#cat t.php
#php t.php
array(3) {
[0]=>
resource(4) of type (stream)
[1]=>
resource(5) of type (stream)
[2]=>
resource(6) of type (stream)
}
string(31) "sh: unknown: command not found
"
command returned 32512
代码来自rango:https://mp.weixin.qq.com/s/z7SPy-tV3hsQqLXZ-tKlZw
怎么办:实际上Swoole提供的System::exec()行为上与PHP的shell_exec是完全一致的,我们写一个shell_exec的同步阻塞版本,执行后发现同样拿不到标准错误流输出的内容,会被直接打印到屏幕。
答案: 使用proc_open+hook实现。
现象:
==================================================================
#php tt.php
PHP Warning: shell_exec() has been disabled for security reasons in /data/www/testswoole/tt.php on line 2
NULL
估计整成错误输出了,于是用:
php tt.php >/dev/null 2>&1
果然,怎么办?加入管道,将此错误指向新的文件描述符。
前置:打开php.ini里面的proc_open禁用函数。
#cat t.php
#php t.php
array(3) {
[0]=>
resource(4) of type (stream)
[1]=>
resource(5) of type (stream)
[2]=>
resource(6) of type (stream)
}
string(31) "sh: unknown: command not found
"
command returned 32512
代码来自rango:https://mp.weixin.qq.com/s/z7SPy-tV3hsQqLXZ-tKlZw
背景:央视网发声明:“中央电视台网”严重侵权,已向相关部门举报,这是不可辩驳的事实。但是我对这个中文域名技术实现的原理有点兴趣,于是问一下技术人员和自己查了下。了解到早些年关于中文域名被好多网络公司买的如火如荼,也养活了好多网络公司多少年,在这里我们不讨论中文是否有价值,我们这里讨论一下中文域名的工作原理,下面是RFC文件。
RFC3490
(Request For Comments (RFC),是一系列以编号排定的文件。文件收集了有关因特网相关资讯,以及UNIX和因特网社群的软件文件。目前RFC文件是由Internet Society(ISOC)所赞助发行。)
Internationalizing Domain Names in Applications (IDNA)
用户输入国际化域名后,由应用程序完成本地码到Unicode编码的转换,然后再完成Unicode编码到7位Punycode编码的转换,然后由解析器(Resolver)发给DNS服务器进行解析。DNS服务器里存储的不是八位编码的Unicode字符串,而是经过Punycode算法处理的7位编码字符串。
IDNA中应用程序对IDN进行ToASCII和ToUnicode操作的时候会调用Punycode算法完成七位和八位数据的转换操作。
ToASCII和ToUnicode过程参见RFC3490 4.1和4.2小节
一个八位Unicode表示的域名字段的字符串将会被转化成为七位字母数字表示的字符串,并添加前缀“xn--”以便与其他英文域名区分,表示这个域名字段是IDN。
按照上面的解释,我们以侵权域名“中央电视台网.网址”为例,软件环境为ie7简体中文版
中央电视台网.网址. ==>Punycode编码转换. ===> Punycode编码转换后:
xn--fiq53l90e917a0tk4ip.xn--ses554g
www.中央电视台网.网址. =怎么编码变为下面这串的呢?=>
http://www.xn--fiq53l90e917a0tk4ip.xn--ses554g/
于是在浏览器里输入这个“中央电视台网”侵权事宜的域名:
www.中央电视台网.网址. =怎么编码变为下面这串的呢?===我们在ie7的状态栏中看到==》
http://www.xn--fiq53l90e917a0tk4ip.xn--ses554g/
在ie6的时代,是不支持中文域名的使用的,为什么现在ie7就支持了呢,我们理解一下RFC3490的内容
“由应用程序完成...”,“程序”这里是指ie7,或者更高浏览器,或者其它浏览器,“完成”指的是浏览器中内置了Punycode的转换,意思是浏览器里面主动加入了中文域名自动转码。ie7简体中文内置了自动转码工具,其它的就不知道了,说白了就是浏览器厂商将这个功能加上去,我们就能用,不加我们就用不起来。
“解析器”也是浏览器内置的。
“DNS服务器解析”我们在网络配置中选择了“自动获得DNS服务器”,我们在这里将DNS服务器改掉,改成了美国的DNS服务器,如:8.8.8.8. 网站是无法打开,这就说明我们选择国外的DNS服务器,中文域名是无法使用的。
从上面的内容中,我们可以总结出,在目前好多浏览器在国内支持中文域名是因为cnnic和浏览器开发商之间进行了合作,让浏览器内置Punycode编码转换。所以来讲应该只有中文版的浏览器才能支持中文域名,
再从DNS服务器解析来讲,只有在国内,或者说是使用国内的DNS服务器才能支持中文域名。
附中文域名编码转换工具:http://tools.jb51.net/punycode/index.php?decoded=%E4%B8%AD%E5%A4%AE%E7%94%B5%E8%A7%86%E5%8F%B0%E7%BD%91.%E7%BD%91%E5%9D%80&encoded=&encode=%E7%BC%96%E7%A0%81
cctv央视网侵权申明:https://news.cctv.com/2020/10/23/ARTIALUGD9zJSrbdIBxuC4gE201023.shtml
RFC3490
(Request For Comments (RFC),是一系列以编号排定的文件。文件收集了有关因特网相关资讯,以及UNIX和因特网社群的软件文件。目前RFC文件是由Internet Society(ISOC)所赞助发行。)
Internationalizing Domain Names in Applications (IDNA)
用户输入国际化域名后,由应用程序完成本地码到Unicode编码的转换,然后再完成Unicode编码到7位Punycode编码的转换,然后由解析器(Resolver)发给DNS服务器进行解析。DNS服务器里存储的不是八位编码的Unicode字符串,而是经过Punycode算法处理的7位编码字符串。
IDNA中应用程序对IDN进行ToASCII和ToUnicode操作的时候会调用Punycode算法完成七位和八位数据的转换操作。
ToASCII和ToUnicode过程参见RFC3490 4.1和4.2小节
一个八位Unicode表示的域名字段的字符串将会被转化成为七位字母数字表示的字符串,并添加前缀“xn--”以便与其他英文域名区分,表示这个域名字段是IDN。
按照上面的解释,我们以侵权域名“中央电视台网.网址”为例,软件环境为ie7简体中文版
中央电视台网.网址. ==>Punycode编码转换. ===> Punycode编码转换后:
xn--fiq53l90e917a0tk4ip.xn--ses554g
www.中央电视台网.网址. =怎么编码变为下面这串的呢?=>
http://www.xn--fiq53l90e917a0tk4ip.xn--ses554g/
于是在浏览器里输入这个“中央电视台网”侵权事宜的域名:
www.中央电视台网.网址. =怎么编码变为下面这串的呢?===我们在ie7的状态栏中看到==》
http://www.xn--fiq53l90e917a0tk4ip.xn--ses554g/
在ie6的时代,是不支持中文域名的使用的,为什么现在ie7就支持了呢,我们理解一下RFC3490的内容
“由应用程序完成...”,“程序”这里是指ie7,或者更高浏览器,或者其它浏览器,“完成”指的是浏览器中内置了Punycode的转换,意思是浏览器里面主动加入了中文域名自动转码。ie7简体中文内置了自动转码工具,其它的就不知道了,说白了就是浏览器厂商将这个功能加上去,我们就能用,不加我们就用不起来。
“解析器”也是浏览器内置的。
“DNS服务器解析”我们在网络配置中选择了“自动获得DNS服务器”,我们在这里将DNS服务器改掉,改成了美国的DNS服务器,如:8.8.8.8. 网站是无法打开,这就说明我们选择国外的DNS服务器,中文域名是无法使用的。
从上面的内容中,我们可以总结出,在目前好多浏览器在国内支持中文域名是因为cnnic和浏览器开发商之间进行了合作,让浏览器内置Punycode编码转换。所以来讲应该只有中文版的浏览器才能支持中文域名,
再从DNS服务器解析来讲,只有在国内,或者说是使用国内的DNS服务器才能支持中文域名。
附中文域名编码转换工具:http://tools.jb51.net/punycode/index.php?decoded=%E4%B8%AD%E5%A4%AE%E7%94%B5%E8%A7%86%E5%8F%B0%E7%BD%91.%E7%BD%91%E5%9D%80&encoded=&encode=%E7%BC%96%E7%A0%81
cctv央视网侵权申明:https://news.cctv.com/2020/10/23/ARTIALUGD9zJSrbdIBxuC4gE201023.shtml
背景:自已写了一个简单的命令行打开网页的go程序。运行时传入参数出现:
./chrome http://gitlab.xx.xxxx.xx/irdcops/k8s.xx.xxxx.xx/-/merge_requests/new?merge_request%5Bsource_branch%5D=xiangdong
zsh: no matches found: http://gitlab.xx.xxxx.xx/irdcops/k8s.xx.xxxx.xx/-/merge_requests/new?merge_request%5Bsource_branch%5D=xiangdong
搜索了一下,找到出现的原因如下:
在 zsh 下使用 find 命令查找指定目录下所有头文件时出现问题:
find . -name *.h
1
no matches found: *.h
后来查看了一些资料才知道,这是由于zsh导致的。
具体原因:
因为zsh缺省情况下始终自己解释这个 *.h,而不会传递给 find 来解释。
解决办法:
在~/.zshrc中加入:
setopt no_nomatch, 然后进行source .zshrc命令
来自:https://blog.csdn.net/u012675539/article/details/52079013
./chrome http://gitlab.xx.xxxx.xx/irdcops/k8s.xx.xxxx.xx/-/merge_requests/new?merge_request%5Bsource_branch%5D=xiangdong
zsh: no matches found: http://gitlab.xx.xxxx.xx/irdcops/k8s.xx.xxxx.xx/-/merge_requests/new?merge_request%5Bsource_branch%5D=xiangdong
搜索了一下,找到出现的原因如下:
在 zsh 下使用 find 命令查找指定目录下所有头文件时出现问题:
find . -name *.h
1
no matches found: *.h
后来查看了一些资料才知道,这是由于zsh导致的。
具体原因:
因为zsh缺省情况下始终自己解释这个 *.h,而不会传递给 find 来解释。
解决办法:
在~/.zshrc中加入:
setopt no_nomatch, 然后进行source .zshrc命令
来自:https://blog.csdn.net/u012675539/article/details/52079013