一个技术宅的个人博客

Centos/MAC系统pnpm升级报错 ERR_PNPM_NO_GLOBAL_BIN_DIR

孙健阅读(1306)

在 CentOS 系统中使用 pnpm i -g pnpm 报错:ERR_PNPM_NO_GLOBAL_BIN_DIR Unable to find the global bin directory,折腾半天终于解决了。

CentOS && pnpmCentOS && pnpm

完整报错信息

[root@VM8 test]# pnpm i -g pnpm
Nothing to stop. No server is running for the store at /root/.local/share/pnpm/store/v3
ERR_PNPM_NO_GLOBAL_BIN_DIR Unable to find the global bin directory

Run “pnpm setup” to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.

按照给出的提示运行 pnpm setup,再次执行 pnpm i -g pnpm 发现还是出现以上报错。
最后才明白执行 pnpm setup 其实是在环境变量中添加了一些 pnpm 的配置,虽然去查看环境变量已存在,但是并没有生效。
因为缺少了一个重要步骤,那就是 source ~/.bashrc,这样才能使环境变量生效。

总结

出现这种报错:ERR_PNPM_NO_GLOBAL_BIN_DIR Unable to find the global bin directory,执行以下两个命令就可以解决:

pnpm setup

# CentOS 系统
source ~/.bashrc

# MacOS 系统
source ~/.zshrc

js获取html携带的url参数,并动态赋值给iframe的src

孙健阅读(10087)

js获取html携带的url参数,并动态赋值给iframe的src,废话少说,直接上代码

<html>
<head>
<title>全屏玩游戏</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<script>
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split(“&”);
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split(“=”);
if(pair[0] == variable){return pair[1];}
}
return(false);
}

function changeGameUrl(){
var url= getQueryVariable(‘url’);
document.getElementById(“gameUrl”).src = url;

}

</script>
</head>
<body onload=”changeGameUrl();”>
<iframe id=”gameUrl” width=”100%” height=”100%” src=””></iframe>
</body>
</html>

JSEncrypt长文本分段加解密

孙健阅读(2024)

需求出发点

在进行RSA加密中,由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序就会抛出异常,下面就给出如何完成前端RSA分段解密和后端RSA分段解密。js加密库使用的是比较成熟的JSEncrypted,地址是https://github.com/travist/jsencrypt/tree/master/bin 下载相应的js文件。

代码开发

对于加密我的方法就是判断字符的特性,然后进行分段处理,循环加密处理。每次加密117bytes,最后合为一体。代码及注释如下:

/**
    * 长文本加密
    * @param {string} string 待加密长文本
    * @returns {string} 加密后的base64编码
    * */
   JSEncrypt.prototype.encryptLong = function (string) {
       var k = this.getKey();
       try {
           var ct = "";
           //RSA每次加密117bytes,需要辅助方法判断字符串截取位置
           //1.获取字符串截取点
           var bytes = new Array();
           bytes.push(0);
           var byteNo = 0;
           var len, c;
           len = string.length;
           var temp = 0;
           for (var i = 0; i < len; i++) {
               c = string.charCodeAt(i);
               if (c >= 0x010000 && c <= 0x10FFFF) {  //特殊字符,如Ř,Ţ
                   byteNo += 4;
               } else if (c >= 0x000800 && c <= 0x00FFFF) { //中文以及标点符号
                   byteNo += 3;
               } else if (c >= 0x000080 && c <= 0x0007FF) { //特殊字符,如È,Ò
                   byteNo += 2;
               } else { // 英文以及标点符号
                   byteNo += 1;
               }
               if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {
                   if (byteNo - temp >= 114) {
                       bytes.push(i);
                       temp = byteNo;
                   }
               }
           }
           //2.截取字符串并分段加密
           if (bytes.length > 1) {
               for (var i = 0; i < bytes.length - 1; i++) {
                   var str;
                   if (i == 0) {
                       str = string.substring(0, bytes[i + 1] + 1);
                   } else {
                       str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);
                   }
                   var t1 = k.encrypt(str);
                   ct += t1;
               }
               ;
               if (bytes[bytes.length - 1] != string.length - 1) {
                   var lastStr = string.substring(bytes[bytes.length - 1] + 1);
                   ct += k.encrypt(lastStr);
               }
               return hex2b64(ct);
           }
           var t = k.encrypt(string);
           var y = hex2b64(t);
           return y;
       } catch (ex) {
           return false;
       }
   };

如果后台是node,那可以使用下面相应的长文本解密方法。其他语言代码逻辑相同。思路就是117bytes的加密,解密使用128bytes位,也就是每128bytes位解密一次,最后拼接在一起。代码及注释如下:

/**
   * 长文本解密
   * @param {string} string 加密后的base64编码
   * @returns {string} 解密后的原文
   * */
  JSEncrypt.prototype.decryptLong = function (string) {
      var k = this.getKey();
      var maxLength = 128;
      try {
          var string = b64tohex(string);
          var ct = "";
          if (string.length > maxLength * 2) {
              var lt = string.match(/.{1,256}/g);  //128位解密。取256位
              lt.forEach(function (entry) {
                  var t1 = k.decrypt(entry);
                  ct += t1;
              });
              return ct;
          }
          var y = k.decrypt(string);
          return y;
      } catch (ex) {
          return false;
      }
  };

使用方法

将上面的两段代码加载JSEncrypt库的后面,使用方法就是将原先加解密调用的方法换为此处的两个方法即可。

 

 

JavaScript使浏览器不使用缓存

孙健阅读(1017)

方法一:

script标签中src链接,或者link标签的href链接,后面加上版本号:

<script type='text/javascript' src='//site.com/js.js?v=1.0.0'><\/script>
<link rel="stylesheet" href="index.css?time=20180910">

方法二:

js生成时间戳:

document.write('<link rel="stylesheet" href="index.css?time='+new Date().getTime()+'">');。

方法三:

css的meta标签设置不缓存

<meta HTTP-EQUIV="pragma" CONTENT="no-cache">
<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<meta HTTP-EQUIV="expires" CONTENT="0">
<meta http-equiv="Cache" content="no-cache">

Bshare,JiaThis以及百度分享代码在HTTPS下失效的问题

孙健阅读(1036)

使用Bshare等分享代码,在网站加了HTTPS之后,会失效,因为这个script里面引了一个非https的js文件。如此一来。解决方案有二:

1.保留http连接,在分享的时候使用http连接。但问题是你不可能把这个办法告诉所有用户,所以这一条不推荐使用。

2.将share代码中的JS引到本地,这样整个JS就都在https的服务器之下,会被识别为安全,则可以显示:

如上图,添加的分享代码,调用的src之中,资源是百度的js文件,而那个http是没有s的。因而需要你手动吧js文件的内容导入到自己本地服务器,这样才可以正常使用分享代码。

3.如果以上方法都不可行,你可以在head头加上这段代码。

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />

php 计算两个时间戳相隔的时间的函数(小时)

孙健阅读(3186)

计算两个时间戳相隔的时间,以前脚本之家发布过具体到天数的,这个可以具体到小时数,需要的朋友可以参考下。
这个是可以具体到小时的php代码
复制代码代码如下:

/* Author: 杨宇 yangyu@sina.cn */
//输入两个时间戳,计算差值,也就是相差的小时数,如返回2:10,则表示输入的两个时间相差2小时10分钟
function hours_min($start_time,$end_time){
if (strtotime($start_time) > strtotime($end_time)) list($start_time, $end_time) = array($end_time, $start_time);
$sec = $start_time - $end_time;
$sec = round($sec/60);
$min = str_pad($sec%60, 2, 0, STR_PAD_LEFT);
$hours_min = floor($sec/60);
$min != 0 && $hours_min .= ':'.$min;
return $hours_min;
}

下面这个是具体到天数的函数代码js
复制代码代码如下:

function get_date_different(){
var _date_1 = document.getElementById('date1').value.replace(/(^\s*)|(\s*$)/g,'');
var _date_2 = document.getElementById('date2').value.replace(/(^\s*)|(\s*$)/g,'');
_date_1 = new Date(_date_1);
_date_2 = new Date(_date_2);
var days= _date_2.getTime() - _date_1.getTime();
var time = parseInt(days / (1000 * 60 * 60 * 24));
document.getElementById('content').innerHTML = '两个日期相差 '+time+' 天!';}

JS,Javascript获取url参数

孙健阅读(1128)

以下JS函数用于获取url参数:

function getQueryVariable(variable)
{
       var query = window.location.search.substring(1);
       var vars = query.split("&");
       for (var i=0;i<vars.length;i++) {
               var pair = vars[i].split("=");
               if(pair[0] == variable){return pair[1];}
       }
       return(false);
}

使用实例
url 实例:

http://www.sunjian.cc/index.php?id=1&image=awesome.jpg

调用 getQueryVariable(“id”) 返回 1。

调用 getQueryVariable(“image”) 返回 “awesome.jpg”。