分类目录归档:佳佳教程

WebGL2画球

本文演示的代码均在这里,本文仅说明原理,不会细化到webgl基础。

最近学会了用WebGL2画球,其实学会也有两个多月了,但由于某些误解一直没法生成正确的贴图映射,导致贴图错乱,直到两周前才突然开窍发现了原因,又拖到今天才来发这么一篇文章。忙里偷闲做事就是效率低下,好在并没有什么迫切需求要做,慢慢学也无所谓。

要用WebGL画球主要就是要先建个球模,然后给它上色或者贴图。要贴图就要搞清楚每个顶点和贴图的坐标映射关系,不同的球模类型映射关系也不一样,我这画的是最容易理解的经纬球,即以地球仪那种经纬线为线框的球体。

接下来开始我们的正题。

先摆一个随便找的经纬球

现在假装看不见经线(竖线),只能看见纬线(横线),那么这个球外面每隔一定的角度就绕着一个正圆,我们生成模型也可以用这种逻辑,首先生成一个正圆,然后把它按角度调整好大小并放到正确的位置上。关于生成一个合适边数的圆的方法我在前一篇文章已经写过了,这里就不再赘述了。

继续阅读WebGL2画球

画一个尽量圆的圆

在屏幕上绘制圆的时候实际上就是在画一个正多边形,只是边非常多而已。

这篇文章来水一个画多少边合适的问题。(注:我并不是不知道canvas2d有圆弧绘制函数,这是为下一篇文章准备的内容)

要一个圆的边看起来平滑,就需要边数足够多,直到在屏幕上看不出它有棱角就够了,这里摆一幅图。

继续阅读画一个尽量圆的圆

ParseError: ‘import’ and ‘export’ may appear only with ‘sourceType: module

首先这个错误是Browserify报出来的,看着网上一篇篇给babel加preset的解决方案让我一度以为这是babel出问题了。

但我按照那些方案依然不能解决这个问题,比如加stage-0,还有加es2015的preset之类的,另外现在这些preset已经被弃用了,官方推荐用preset-env来代替。而我手动加了commonjs的plugin也一样报错。

一番研究之后发现我其他所有es模块被引用都能正常打包,唯独node_module里面的一个模块的es6模块不能加载,看来Browserify是默认不允许node_module里的模块以es6格式输出模块的。所以解决方案是要么把文件从node_module里移出来,要么想办法让Browserify允许node_module以es6输出模块,我最后用的是前者,因为那个sourceType:module我怎么设置也依然没有效果。

PHP输出内容到控制台

有时候本地开发的时候会使用 php -S 命令启动一个服务器来调试,由于该web服务器模式直接echo会把内容输出到页面上,所以需要想办法把内容输出到控制台界面。

php里有几个 php:// 开头的特殊读写流可以使用,文档见此:https://www.php.net/manual/en/wrappers.php.php

虽然该页面上说有常量 STDIN STDOUT 和 STDERR ,但是不知道为啥使用它们会报错不存在常量,所以我们可以自己定义:

然后就可以定义自己的输出函数来输出到控制台了

 

Windows下挂载目录为驱动器

曾经我的电脑使用一块128G的SSD来放系统,程序和其他文件都在另一块机械硬盘里,后来换上了960G的SSD之后光是放了个系统和装了一些软件依然还空着500多G,所以想着还是把原本的80多G软件全都移到SSD里去吧。

那么问题来了,这些软件的安装位置全是D盘,如果直接把程序移走那会出很多问题,这就意味着我必须要确保把它们移到SSD后依然属于D盘,然后就想到了两个常规方案:分区,挂vhd。

首先是分区,在我用了macos和一些linux后越来越觉得分区这个操作很多余,完全可以使用文件夹来取代分区。主要问题在于分区会产生额外的空间限制,所以慢慢地我开始不再给自己的硬盘分区了,于是这个方案排除,但如果没有其它选择,这个方案还是优于vhd的。

然后是vhd,考虑到性能损耗和文件碎片问题,直接就排除了,我也不想看到一个几十G大的vhd。

由于当时我已经把所有软件移到了 C:\files\Drivers\D ,所以直接开始寻找是否有办法直接把目录挂在为一个驱动器。一查果然有,一般都是说用subst命令直接把目录挂在为驱动器,如 subst p: c:\poi 就可以把c盘的poi目录挂在为p盘。但是这个方案在win10似乎有些bug,需要一些曲折的操作来实现,所以不太好使。然后继续找办法。

最后在某一篇文章里发现可以在注册表里直接加驱动器,位置是 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices ,打开到这个位置可以看到已经有一些映射设置了。

那篇文章里写了一个注册表文件,内容类似

但是我试了一下发现并没有用,重启之后挂载出来了一个打了问号的驱动器,那么说明这个映射源并不存在,所以我这里的值不能这么写。

然后我参考了一下这个列表里的其它条目,感觉也许可以从 \DosDevices\ 下面直接进入驱动器号,所以改成了 \DosDevices\C:\files\Drivers\D ,重启了一下果然挂载上了,现在这个目录会在开机时被挂载为D盘,并且由于属于同一个盘所以会和C盘显示同样的空间使用情况,有一个小问题就是这个盘没法修改卷标,所以也会和C盘显示一样的名字。挂载后的样子如下:

名字什么的无所谓了,好用就行。

另外这样挂载的驱动器没有回收站,但是可以去原始目录里删除文件,其实问题不大。

===========更新============

这个方法挂载的盘会在系统大版本更新的时候被重置,更新结束后映射会消失,需要重新设置,不建议用来映射存放程序的目录

PHP并行cURL中socks代理问题

这是一篇被坑记录。关键字: CURLOPT_PROXY, CURLPROXY_SOCKS5, curl, curl_multi_init, curl_multi_add_handle, curl_multi_exec, curl_getinfo, socks5.

我的友链状态是通过cron任务定时调用php脚本来检查的,并且这个脚本通过curl走socks5代理出去请求网站和对应的logo。

本来这个脚本是遍历json中的友链一个个去请求然后设置状态的,逻辑上没有任何问题,也可以顺利完成检测,问题是这样的检测时间太长了,如果我手动请求检测脚本的地址那么一定会执行超时,而且我会看不见结果。于是我想把这个脚本里的请求改成并行的,一次性请求所有网站。然后问题来了,按照php手册上 curl_multi系列的函数改好了脚本之后无论怎么运行怎么修改一定会执行失败。无论怎么修改,curl multi组一定会超时,所有请求都会失败,浪费了我六七个小时研究这个问题。

 

直到我偶然间看到了这个页面上的这段话

10.1 SOCKS proxy connections are done blocking

Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very bad when used with the multi interface.

我记得曾经我就尝试过把这个脚本改成并行请求,但也是因为无论如何都会请求失败后来直接放弃了。这个影响那么大的bug几年过去了依然没有修好,不愧是世界上最好的语言。

也就是说现在php的并行cURL不能设置socsk代理,否则一定会阻塞住然后请求失败,要解决这个问题只能改用http代理。

解决Macbook休眠异常 待机掉电过快

请先确认apple官方给出的方法都没有用之后再尝试此文方法!

曾经我的mbp拔掉电源合上盖子以后一天过去几乎都不怎么掉电,基本上会少个百分之一到三。但是最近一年不知道怎么回事,待机一天过去电量会掉一半多(并不是因为电池老化)。我也不清楚是从什么时候开始这样的了,也许是某次系统升级后吧,毕竟我也没有特别去动过电源设置。

原本我也一直想找到导致这个问题最根本的原因,不过试了很多次都没找到。最近买了mbp的sea也有同样的问题,于是想着干脆把这个问题强行解决掉算了。

继续阅读解决Macbook休眠异常 待机掉电过快

Rust 基本数据类型

之前就有点感兴趣,现在又仔细看了以下,并做个笔记。(并不是表示我要学会,只是稍作了解。这种编译型静态类型语言我还是更倾向用c++)

下面变量全都加了下划线前缀是因为变量定义了不使用的话编译器会给出警告,除非加了_前缀。

 

npm多用户

npm的用户登录信息写在用户目录的 .npmrc 文件里,所以同一时间只能登录一个账号,要切换账号的话就要重新用 npm login 登录,比较麻烦。

于是写了个切换.npmrc文件来直接切换用户的shell脚本

分别login到对应的用户,然后查看用户目录里的.npmrc文件内容,复制出来,填到下面对应的地方

保存成比如 npmuser 文件放在某个PATH目录里,然后用 npmuser user1 这样的命令就可以直接切换用户而不用再登录了。

让Windows在高DPI显示屏上正确显示

我在macbook上虚拟机里装了个Win10,装好了之后发现,一切都是那么的小,小的几乎看不清。因为这个macbook是Retina屏的,所以dpi比较高,于是东西都变小了。

我的标题里不直接写win10是因为我也不知道自定义项目大小是从哪个系统开始有的,没有这个功能的系统很简单,就是把分辨率按比例调低即可。

继续阅读让Windows在高DPI显示屏上正确显示

Error: Cannot find module ‘npmlog’

手动安装node的时候一不注意就会出现这个错误,装好了之后使用命令 npm 测试一下出来了这个错误: Error: Cannot find module 'npmlog' 。

 

这一般是放在/bin里的链接不对导致的。

可能情况1

链接指向的不是 node_modules/npm/bin/npm-cli.js ,初次手动安装难免会搞不清要链接哪个文件,把链接指向正确的位置即可。

情况2

使用的不是软链接,由于npm-cli.js中使用的是相对路径,要是你一不小心链了个硬链接,那么npm就会从/bin解析相对路径,所以就找不到npmlog模块了。要使用软链接,在ln命令后加上 -s 选项: ln -s node_modules/npm/bin/npm-cli.js /bin/npm

 

解决node无法调用全局模块的问题

刚刚我把SPDY装到全局, npm -g install spdy ,

可以看到这个模块被装到/usr/local/lib/node_modules里了

 

 

 

然后开个环境测试一下,结果

吓得我满脑子都是doge!!!这是为什么?

继续阅读解决node无法调用全局模块的问题