今天看见了别人总结的,感觉太有用了。 num&0x1, 为1说明是奇数,为0说明是偶数。因为只看二进制位的最后一位 a % b,当底b为2的n次幂的时候,可以改写成 a & (b - 1) 原理也是按位只看最后n位的数据,高位直接不用看。 我这个还专门看了一下有多块,数量级差的太多了, 但初步能看见的时间来说,1亿次差了0.1秒,从时间成本上来说其实差别不大。 看了一下,差了四条汇编指令,还得考虑取数据的时间

Continue

写了个汇编程序,照着别人的写的,其中有个系统调用,然后就去搜了一下linux系统的系统调用表。这一搜不要紧,搜出问题来了。 我找到了两个版本,一个x86-64版本的,一个i386版本的。比如32位的sys_exit系统调用里调用号%eax为1,64位里sys_exit调用号%rax为60,这个不重要。然后我看了一下我的代码,我用了32位的调用号,功能也是32位的。第一反应就是编译的elf是32位的,然后我看了一下readelf -h 64,为64位。后来发现还有个简单命令 直接file 64就能看。然后我就觉得很不可思议。 接着我查了两个版本的头文件在哪里,看怎么用的。学到很多东西。比如查看调用头文件 printf SYS_exit | gcc -include sys/syscall.h -E - echo '#include <unistd.h>' | gcc -E -x c -l echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u

Continue

有时候经常感觉喘不过气来,容易耸肩紧张,幸好有时候能发现,可以调整一下。 工作生活压力都有,工作突然间赶进度。我不知道为什么一安排进度,我就容易急,一急就容易效率低下。晚上还想干别的,还想学别的,各种选择中的矛盾。睡觉总感觉睡不好还是没睡够,对睡眠不满意。 感觉又开始掉头发严重了,这个还会导致恶性循环。 仔细分析一下,发现工作和生活的压力还是相关联的,只能有侧重点。工作上我要保证进度,但不要求多么快,我做的已经够好了,没必要急。主要还是先把心态调整好。 自己的学习进度,上班时候中午和下班后抽出1到1.5个小时来做或者学习。可以分散一下晚上的压力,也可以学习知识不耽误。还有时间可以写点自己程序。晚上回去按进度来,也不用急,急也没有用。可以抽调试程序,可以安排休息时间,把时间都安排满也是不正确的。比如万一一段时间什么没干,就容易着急引发焦虑,所以需要缓冲的时间。 还有就是技术上写代码的问题,一个想写点高大上的项目,一个想写游戏。写游戏也能锻炼编程能力,能学很多东西,但对于当前的工作职业来说,似乎帮助不太大,以后基本不会转到游戏开发。但你研究技术,比如编译器,操作系

Continue

昨天下了一个软件,需要jdk8版本的,我之前开发是用的openjdk11版本的。就想找找怎么安装多个版本的,我之前知道可以知道path环境变量改变,就想找找有没有类似多版本管理的软件。 然后找到一个系统级别的update-alternatives,然后执行update-alternatives --config java,可以进行java版本的选择,我发现我之前安装过java8的jre了版本了。也没有切换,直接复制路径去执行的jar包。 然后就研究了一下update-alternatives 命令。配置文件目录为/var/lib/dpkg/alternatives/java 涉及的原理就是通过文件软链接来实现版本的切换。 ls -alh /usr/bin/java lrwxrwxrwx 1 root root 22 7月 22 2019 /usr/bin/java -> /etc/alternatives/java ls -alh /etc/alternatives/java lrwxrwxrwx 1 root root 43 7月 22 2019

Continue

先说一下pyenv的安装方式,只有两步,第一步是将github项目clone到目录,第二步是添加环境变量。所以pyenv完全可以离线安装,比如操作系统版本一致的时候,直接把装好的pyenv环境和virtualenv环境复制到目标系统就可以了。然后添加一下环境变量。 我之前安装过pyenv了,更新pyenv进入pyenv目录后,执行git pull。 然后我复制了一份新的代码,改变环境变量,切换到新pyenv目录。然后卸载之前直接安装的python版本。pyenv uninstall 3.7.3 进入.pyenv_bak,mkdir cache.将源码包放到cache目录下。 进入.pyenv_bak/plugins/python-build/share/python-build目录,编辑3.7.3文件 #require_gcc prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.opens

Continue

主要看pymain_run_filename,是文件执行pymain_open_filename,不是文件赋值fp = stdin,最后执行pymain_run_file(fp, pymain->filename, cf)。看这里应该交互和文件执行都在这一个里边的。 pymain_open_filename就是打开文件返回句柄。 pymain_run_file文件里,主要就是调用PyRun_AnyFileExFlags。下面应该与main.c没关系了,主要在Python/pythonrun.c里了. pymain_repl里调用 PyRun_AnyFileFlags,然后也是调用的PyRun_AnyFileExFlags。 PyRun_AnyFileExFlags里, Py_FdIsInteractive判断是否是交互模式,如果是调用PyRun_InteractiveLoopFlags,里边有个do,这个不看了。如果不是调用PyRun_SimpleFileExFlags, 先调用PyImport_AddModule,interp->modules里插入了__mai

Continue

按照上一篇的流程 Modules/main.c里, pymain_main里pymain_init里的pymain_cmdline,是解析参数的。 初始化一个_PyCmdline,暂存参数的 line464 typedef struct { wchar_t **argv; int nwarnoption; /* Number of -W options */ wchar_t **warnoptions; /* -W options */ int nenv_warnoption; /* Number of PYTHONWARNINGS options */ wchar_t **env_warnoptions; /* PYTHONWARNINGS options */ int print_help; /* -h, -? options */ int print_version; /* -V option

Continue

看Makefile.pre.in文件,入口函数在Programs/python.c文件里,发现main函数。 只调用的Modules/main.c的_Py_UnixMain函数,这里面初始化了_PyMain,用来保存参数,然后调用pymain_main 先调用pymain_init,后调用pymain_run_python,最后调用pymain_free. pymain_init里,初始化_PyCoreConfig,大体看是pyvm的一些参数,先不关心。然后调用pymain_cmdline,大体看是解析参数的,不关心。pymain_init_stdio设置了stdin_is_interactive的值,这个可能有用,先记录。然后调用_Py_InitializeCore,里边调用_Py_InitializeCore_impl,里边各种初始化,不跟进去看了。 里边调用了一个_PyImport_Init,没啥,_PyImportHooks_Init,初始化了几个sys的参数,但是都是空值, sys.meta_path, sys.path_importer_cache,sys.

Continue

最近总结了两条想当然造成的麻烦,虽然问题不太大,但是值得总结。 一个是执行linux命令的时候,开始用一个算是知道的命令,执行也没问题。然后测试需要执行多遍,脑子一抽,想起一个别的更短的命令,然后也没查,想当然的猜了一下参数。结局就是教训,虽然没有什么损失,但是当时就反思了。不知道是什么造成了我的想当然。 第二个是今天,之前搞的不是我负责的java的项目,前后捋了一下。那个组负责的人来找我问我每个页面都是干什么的,前端不是我写的,跟原型出入很大,他们也不看原型。总的来说就是好像总想嘲笑我,问的我很烦,我就说把我之前给前端的文档发给他。 后来又来问我状态转换按钮的事,我想当然的说了一个就是删除请求,我没物理删除。然后他回去跟别人说了一通,回来又找我,让我在测试环境测试一下,让我证明一下,多选删除,不会删除,那个页面还会有数据。然后我竟然谨慎了,没有操作。然后他又让我新加一个删除,我试了一下,确实物理删除了。然后马上看代码,确实是物理删除。状态更新是走的更新接口。 一个主要是代码写的时间比较久了,第二个就是我之前的python项目非特殊都是软删除,所以这里以为我也写了软删除

Continue

这几天忙着写文档,一直看的线上环境的系统。今天启动本地测试环境,发现登录不成功。排查问题发现登录成功后,之后的请求没有携带cookie。然后我就仔细看了一下登录请求的参数。 发现在chorme header头的cookie里有一个黄色的小叹号,发现问题了。 this set-cookie didn't specify a "SameSite" attribute,然后变成默认Lax。(不能复制,懒得打英文了) 然后我搜索了一下Samesite定义,有三个值,None, Lax,Strict.这个参数是防止跨站攻击用的,因为测试环境,所以最方便就是跨站调试了。 然后我搜了一下flask源码,发现有这个设置,配置了一下发现不管用。然后放弃了。 找了一下怎么关闭chrome的这个选项,虽然别的网站可能有一点风险。自己调试的时候会方便点。 chrome://flags/#same-site-by-default-cookies chrome://flags/#cookies-without-same-site-must-be-secure

Continue